Konvertieren Member-Funktion-Zeiger auf TIMERPROC

Wie konvertiere ich eine member-Funktion-Zeiger auf die TIMERPROC Typ für die Verwendung mit der WINAPI SetTimer? Der folgende Codeausschnitt zeigt, wie mache ich es jetzt, aber wenn ich compile bekomme ich diesen Fehler:

error C2664: 'SetTimer' : cannot convert parameter 4 von 'void (__stdcall CBuildAndSend::* )(HWND,UINT,UINT_PTR,DWORD)' in 'TIMERPROC'

Den Rückruf muss gebunden werden, um seinen ursprünglichen Instanz der Klasse. Wenn es eine bessere Weise, das zu tun, ich bin ganz Ohr. Danke.

class CMyClass
{
public:
    void (CALLBACK CBuildAndSend::*TimerCbfn)( HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime );

private:
    void CALLBACK TimeoutTimerProc( HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime );
};

CMyClass::CMyClass()
{
    ...

    this->TimerCbfn = &CBuildAndSend::TimeoutTimerProc;

    ...

    ::CreateThread(
        NULL,                           //no security attributes
        0,                              //use default initial stack size
        reinterpret_cast<LPTHREAD_START_ROUTINE>(BasThreadFn), //function to execute in new thread
        this,                           //thread parameters
        0,                              //use default creation settings
        NULL                            //thread ID is not needed
        )
}

void CALLBACK CMyClass::TimeoutTimerProc( HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime )
{
    ...
}

static DWORD MyThreadFn( LPVOID pParam )
{
    CMyClass * pMyClass = (CMyClass *)pParam;

    ...

    ::SetTimer( NULL, 0, BAS_DEFAULT_TIMEOUT, pMyClass->TimerCbfn ); //<-- Error Here

    ...
}
  • mögliche Duplikate von Weitergabe von Benutzerdaten mit SetTimer
  • BTW, jedes mal, wenn Sie eine Form mit einer Funktion (oder die Funktion Zeiger) in einer win32-API gibt es in der Regel, es gibt eine Art von Fehler. Wenn es nicht kompilierbar ist, dann in der Regel muss die Funktion geändert werden; das hinzufügen einer Besetzung ist einfach übertapezieren ist das problem. Glück für Sie, stellt sich heraus, dass C++ (Zeiger auf) die Funktionen sind ein völlig anderes Tier als (Zeiger auf) einfache Funktionen, also nicht einmal reinterpret_cast ist in diesem Fall möglich.
InformationsquelleAutor Jim Fell | 2011-06-24
Schreibe einen Kommentar