Zitat von
Luckie:
Hat dein Thread ein Fenster und eine Nachrichtenschleife?
Da bin ich jetzt etwas überfragt. Ich habe ein Fenster
Handle...
Die Objekt Variable meines Notifyer ist in der
DLL global definiert. Das Notifyer Objekt wird in einer "init" Funktion (welche immer als erstes aufgerufen werden muss wenn man andere Funktionen der
DLL verwenden möchte) erstellt.
Das Notifyer Objekt reagiert auf die WM:
Delphi-Quellcode:
constructor TNotifyUSB.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FWindowHandle := AllocateHWnd(WndProc);
USBNotifyRegister;
...
end;
function TNotifyUSB.USBNotifyRegister: Integer;
var
dbi : DEV_BROADCAST_DEVICEINTERFACE;
Size : Integer;
r : Pointer;
ret : Integer;
begin
ret := DLL_CO_USB_NOTIFY_REGISTER_FAILED;
Size := SizeOf(DEV_BROADCAST_DEVICEINTERFACE);
ZeroMemory(@dbi, Size);
dbi.dbcc_size := Size;
dbi.dbcc_devicetype := DBT_DEVTYP_DEVICEINTERFACE;
dbi.dbcc_reserved := 0;
dbi.dbcc_classguid := GUID_DEVINTERFACE_USB_DEVICE;
dbi.dbcc_name := nil;
r := RegisterDeviceNotification(FWindowHandle,
@dbi,
DEVICE_NOTIFY_WINDOW_HANDLE);
if Assigned(r) then ret := 0; // ??? Retwert anpassen
Result := ret;
end;
procedure TNotifyUSB.WndProc(var Msg: TMessage);
begin
if (Msg.Msg = WM_DEVICECHANGE) then
begin
try
WMDeviceChange(Msg);
except
Application.HandleException(Self);
end;
end
else
Msg.Result := DefWindowProc(FWindowHandle, Msg.Msg, Msg.wParam, Msg.lParam);
end;
Ich mache nur die
DLL. Es kann sein dass eine Funktion der
DLL in einem Thread aufgerufen wird, muss aber nicht. Das weiß ich leider nicht.