Will ja nicht pushen, aber ich werde noch Wahnsinnig!
Das SetTimer geht nicht, auch nicht per Callback.
Dies wird erst ausgelöst wenn die Form angezeigt wird!
Der Ablauf ist nun so:
Die
DLL wird geladen,
INIT-Funktion wird aufgerufen -> Thread wird erstellt -> Execute -> frMain (Form wird erzeugt):
Delphi-Quellcode:
procedure TMyMainThread.Execute;
var
msg:Tmsg;
begin
try
InitFinished := False;
if Not Assigned(frMain) then
frMain := TfrMain.Create(NIL);
frMain.AddLog('plugin got init');
InitFinished := True;
while not Terminated do
begin
Sleep(1);
if PeekMessage(msg, 0, 0, 0, PM_REMOVE) then //warten auf Message then
begin
case msg.message of
WM_SHOWFORM:
begin
if IsWindow(msg.wParam) then
if Application.Handle <> msg.wParam then
Application.Handle := msg.wParam;
if NOT frMain.Showing then
frMain.Show;
end;
WM_STARTUP:
begin
if Assigned(frMain) then
frMain.Start_StartUp(StartDelay);
end;
WM_STOP:
begin
if Assigned(frMain) then
begin
frMain.AddLog('stopped plugin');
if ((Assigned(frMain.HIDDevice)) and (not frMain.HIDDevice.IsPluggedIn)) then
frMain.JvHidDeviceController.CheckIn(frMain.HIDDevice);
if Assigned(frMain.JvHidDeviceController) then
FreeAndNil(frMain.JvHidDeviceController);
end;
end;
WM_QUIT: Terminate;
else begin
//TranslateMessage(msg);
DispatchMessage(msg);
end;
end;
end;
end;
finally
if Assigned(frMain) then
begin
if frMain.Showing then
frMain.Close;
FreeAndNil(frMain);
end;
end;
end;
//funktion was ausgelöst wird wenn das Device entfernt wird:
Delphi-Quellcode:
procedure TfrMain.JvHidDeviceRemoval(HidDev: TJvHidDevice);
begin
AddLog('Device got removed: ' + HIDDevice.ProductName);
if ((Assigned(HIDDevice)) and (NOT HIDDevice.IsPluggedIn)) then
begin
if ((HidDev.Attributes.VendorID = VendorID) AND
(HidDev.Attributes.ProductID = ProductID) AND
(HidDev.ProductName = ProductName )) then
begin
try
PostThreadMessage(MyMainThread.ThreadID, WM_STOP, 0, 0);
OutputDebugString(PWideChar('Device got disconnected'));
finally
//todo
end;
end;
end;
end;
Nun bleibt meine
DLL in frMain.JvHidDeviceController.CheckIn(frMain.HIDDev ice); stehen!
Wenn das Device geöffnet wird, wird für HIDDevice ein "WorkerThread" erzeugt.
Dieser will bei CheckIn gestoppt werden.
Und bei Thread Waitfor wartet man für immer, ausser die EXE wird beendet, dann kommt der Debugger sofort aus dem TThread.Waitfor zurück.
Irgendwie kommen immer wieder neue Probleme mit
DLL + Form auf...