Einzelnen Beitrag anzeigen

schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#24

Re: DLL Init, Timer läuft nicht an

  Alt 15. Apr 2010, 19:24
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...
Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat