Announcement

Collapse
No announcement yet.

Timer in einer DLL

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Timer in einer DLL

    Ich möchte innerhalb einer DLL einen Timer setzen, welcher die Ausführung der DLL nach einer bestimmten Zeit beendet, egal was diese noch tut. Ich verwende kein Formular in der DLL!
    Kann mir jemand helfen? Danke! Uwe

  • #2
    Hallo,

    für diese Aufgabe gibt es verschiedene Lösungsalternativen: <br>
    a) Datenmodul einbinden und dort eine TTimer-Komponente ablegen <br>
    b) Fensterhandle anfordern und Win32-API-Funktion <b>SetTimer</b> aufrufen <br>
    c) Win32-API-Funktion <b>SetTimer</b> ohne Hilfsfenster aufrufen. <br>
    Für die Alternative b) habe ich ein Beispiel "am Lager":

    <b>DLL:</b>
    <pre>
    library TimerDLL;

    uses
    Windows, Messages, SysUtils, Classes, Forms;

    {$R *.RES}

    type
    TAllocWndTest = class(TObject)
    private
    FWndHandle : HWND;
    procedure WndProc(var Msg: TMessage);
    public
    constructor Create;
    destructor Destroy; override;
    property WindowHandle: HWND read FWndHandle;
    end;

    var
    FAllocWin : TAllocWndTest;

    constructor TAllocWndTest.Create;
    begin
    FWndHandle := AllocateHWnd(WndProc);
    end;

    destructor TAllocWndTest.Destroy;
    begin
    DeAllocateHWnd(FWndHandle);
    inherited Destroy;
    end;

    procedure TAllocWndTest.WndProc(var Msg: TMessage);
    begin
    if Msg.Msg = WM_TIMER then
    MessageBox(0, 'Die Botschaft WM_TIMER ist eingetroffen',
    'Timer in einer DLL', 0);
    Msg.Result := DefWindowProc(FWndHandle, Msg.Msg, Msg.wParam, Msg.lParam);
    end;

    procedure StartTimerInDLL;
    begin
    FAllocWin := TAllocWndTest.Create;
    SetTimer(FAllocWin.WindowHandle, 1, 2000, nil)
    end;

    procedure StopTimerInDLL;
    begin
    KillTimer(FAllocWin.WindowHandle, 1);
    if Assigned(FAllocWin) then
    FreeAndNil(FAllocWin)
    end;

    exports
    StartTimerInDLL,
    StopTimerInDLL;

    begin
    end.
    </pre>
    <b>Aufruf im Programm:</b>
    <pre>
    procedure StartTimerInDLL; external 'TimerDLL.dll';
    procedure StopTimerInDLL; external 'TimerDLL.dll';

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    StartTimerInDLL
    end;

    procedure TForm1.Button2Click(Sender: TObject);
    begin
    StopTimerInDLL
    end;
    </pre&gt

    Comment


    • #3
      Hi Andreas

      Das funktoniert sollange wie der Parent-Process seinen Messagequeue auch abfragt, da die wm_Timer Messages ja als PostMessages() vom System verschickt werden.

      "Ich möchte innerhalb einer DLL einen Timer setzen, welcher die Ausführung der DLL nach einer bestimmten Zeit beendet,<b>egal was diese noch tut</b>. Ich verwende kein Formular in der DLL! Kann mir jemand helfen? Danke! Uwe"

      Jo, das führt dann zum crash !

      Gruß Hage

      Comment

      Working...
      X