Funktion einbauen: Timer und Callback



  • Hallo Forum,

    ich möchte einen Timer (CreateTimerQueueTimer) in mein C Programm einbauen. Mein Kompiler stört sich jedoch an der Art der Callback Funktion.
    Laut MS Seite:

    BOOL WINAPI CreateTimerQueueTimer(
    __out PHANDLE phNewTimer,
    __in_opt HANDLE TimerQueue,
    __in WAITORTIMERCALLBACK Callback,
    __in_opt PVOID Parameter,
    __in DWORD DueTime,
    __in DWORD Period,
    __in ULONG Flags
    );

    Quelle
    Die Callback Funktion soll so aussehen:

    VOID CALLBACK WaitOrTimerCallback(
      __in  PVOID lpParameter,
      __in  BOOLEAN TimerOrWaitFired
    );
    

    Quelle

    Die __in Kompileranweisungen haben ich entfernt, ansonsten habe ich die Callback Sub so definiert. Also rufe ich jetzt CreateTimerQueueTimer auf:

    HANDLE hTimer=NULL;
    CreateTimerQueueTimer(
    &hTimer,
    NULL,
    &WaitOrTimerCallback,
    NULL,
    3000,
    0,
    0
    );
    

    Der Kompiler markiert nun den dritten Parameter (&WaitOrTimerCallback) und sagt "Assignment of Pointer to function that differ in argument 2". Laut der MS Hilfe sollte doch der Timer so funktionieren?

    Vielen Dank

    Mukki



  • Zeig mal exakt deine WaitOrTimerCallback Funktion.
    Simon



  • Die Funktion ist:

    VOID CALLBACK alarmInterrupt(PVOID lpParam, BOOLEAN TimerOrWaitFired() {
    
    }
    

    Hab dann natürlich im Timerstart &alarmInterrupt benutzt.



  • Die eine geöffnete Klammer ist natürlich ein Abschreibefehler:

    VOID CALLBACK alarmInterrupt(PVOID lpParam, BOOLEAN TimerOrWaitFired) { 
    
    }
    


  • Also in der win.h steht dieses:

    BOOL WINAPI CeateTimerQueueTimer(
    PHANDLE,
    HANDLE,
    WAITORTIMERCALLBACK,
    PVOID,
    DWORD,
    DWORD,
    ULONG);
    

    Wenn ich meine Funktion jetzt so definiere:

    WAITORTIMERCALLBACK alarmInterrupt(PVOID lpParam, BOOLEAN TimerOrWaitFired) {
    
    }
    

    Kommt immer noch die Fehlermeldung aus Post1.



  • Jetzt hab ichs: Er will snatt BOOLEAN nur BOOL haben.



  • Bist du dir sicher, dass es den Typ BOOLEAN zusätzlich zu BOOL gibt?
    Ansonsten würd ich die Definition mal genau übernehmen, weil

    WAITORTIMERCALLBACK != VOID CALLBACK

    falls nicht irgendein Makro den Quatsch macht!



  • WAITORTIMERCALLBACK ist wie folgtd efiniert:

    typedef VOID (__stdcall *WAITORTIMERCALLBACK) (
            [in] PVOID lpParameter,
           [in] BOOL  TimerOrWaitFired
    );
    

    Es handelt sich also um einen Funktionszeiger.
    Die Funktion dazu muss folglich so aussehen:

    VOID __stdcall WaitOrTimerCallBack(PVOID param, BOOL TimerOrWaitFired)
    {
    }
    

    Die Makros WINAPI und CALLBACK bedeuten übrigens auch nur __stdcall, wodurch man also auch CALLBACK schreiben kann, das bringt also keine Fehler.

    @Mokka:
    wie du schon gesagt hast, nimm einafch statt BOOLEAN BOOL.
    auch wenn die typedefs gleich sind, würde ich hier nicht darauf vertrauen, dass der Compiler das auch erkennt 😉

    zu __in und __out:
    das sind rein MSVC spezifische Anweisungen, die auch imho erst ab der Professional Version enthalten sind.
    Funktion haben die überhaupt keine in keiner Version.
    Es sind reine Hinweise für den Programmierer, damit er schon beim Anblick der Funktionssignatur erkennen kann,
    ob es sich um EIngabe oder Ausgabeparameter handelt.

    MfG Drako



  • Vielen Dank DrakoXP für die Aufklärung. 🙂
    Bei der Rückgabe eine WAITORTIMERCALLBACK habe ich mich etwas vertan...


Anmelden zum Antworten