Timer in DLL



  • hallo,
    kann mir jemand sagen, wie ich in einer DLL einen Timer benutze? Da ich keine Form zu Verfügung habe, habe ich so einen Timer erstellt.

    TTimer *Timercode;
    
    Timercode->Interval = 5000;
    Timercode->Enabled = true;
    Timercode->OnTimer = TimercodeTimer;
    ...
    void __fastcall TimercodeTimer();
    

    Doch in diesem Fall bekomme ich die Fehlermeldung
    [BCC32 Fehler] maindll.cpp(15): E2034 Konvertierung von 'void (_fastcall *)()' nach 'TNotifyEvent' nicht möglich
    Kann mir jemand sagen, wie ich die Funktion von OnTimer schreiben muss, damit ich das erreiche, was ich von einem Timer auf einer Form gewohnt bin?

    greetz KN4CK3R



  • Hallo

    Der Fehler sagt das du eine Funktion ohne den richtigen Typ dem Event zuweisen willst. Du must da schon eine Methode einer Klasse benutzen, und nicht eine statische Funktion.
    Auperdem darfst du natürlich nicht vergessen überhaupt eine gültige Instanz von TTimer zu erzeugen bevor du dem Pointer etwas zuweist.

    bis bald
    akari



  • kann man irgendwo nachschauen, was für eine Funktion der Timer beim Auslösen benutzt? Weil bei einer Form wird ja auch nur eine void Funktion erstellt und dem ->OnTimer zugewiesen.

    greetz KN4CK3R



  • OnTimer erwartet einen Zeiger auf TObject als Parameter. NULL dürfte es zur Not wohl auch tun.

    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
    }
    

    Ist es so schwer, mal kurz ein Testprojekt mit 'ner Form aufzumachen und sich dort das autogenerierte OnTimer-Event anzusehen?



  • nein, dass das dabei rauskommt, wusste ich auch. Nur wenn ich bei void die Fehlermeldung bekomme, dass es TNotifyEvent sein müsste, dann frag ich mich nur, was es sonst wäre.

    greetz KN4CK3R



  • TNotifyEvent ist ein typedef für ein "closure":

    typedef void __fastcall (__closure *TNotifyEvent)(TObject* Sender);
    

    Wichtig ist dabei der Zusatz __fastcall, d.h. die ersten 2 Parameter werden in Registervariablen übergeben (anstatt auf dem Stack) sowie __closure, d.h. die Methode muß innerhalb einer Klasse deklariert sein. (s.a. BCB-Hilfe)


Anmelden zum Antworten