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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Member-Funktion und TIMEPROC sind nicht kompatible Typen.
Müssen Sie die member-Funktion
static
. Dann wird es funktionieren, vorausgesetzt der parameter-Liste ist die gleiche in beiden, statische member-Funktion und TIMEPROC.Funktion Zeiger sowie die Funktion, beide sind modifiziert. Jetzt sollte es funktionieren.
Nun, da die callback-Funktion wurde zu statisch, es kann nicht auf nicht-statische member der Klasse, weil Sie nicht
this
Zeiger in der Funktion.Zugriff auf nicht-statische member, können Sie dies tun:
Habe ich entfernt
TimerCbfn
von meiner Umsetzung, da es nicht wirklich benötigt. Sie können passTimerProc
direkt zuSetTimer
als letztes argument.CreateWindow
um ein ausgeblendetes Fenster, dessen handle verwendet werden könnte, inSetTimer
. Das würde nicht funktionieren?2>MyClass.obj : error LNK2001: unresolved external symbol "public: static class std::map<unsigned int,class CMyClass *,struct std::less<unsigned int>,class std::allocator<struct std::pair<unsigned int const ,class CMyClass *> > > CMyClass::m_CMyClassMap" (?m_CMyClassMap@CMyClass@@2V?$map@IPAVCMyClass@@U?$less@I@std@@V?$allocator@U?$pair@$$CBIPAVCMyClass@@@std@@@3@@std@@A)
Irgendwelche Ideen?std::map<UINT_PTR, CMyClass*> CMyClass::m_CMyClassMap; //definition
.CMyClass
instanziiert wird. Haben Sie irgendwelche Ideen, was ist die Ursache? Nur denke ich mir denken kann ist, dass es hat etwas zu tun mit dem Zusatz vonstd::map
.first-change exception
?First-chance exception at 0x0526a9de (MyApp.dll) in ParentApp.exe: 0xC0000005: Access violation reading location 0x00000008.
Dies geschieht, sobaldnew CMyClass(...)
genannt wird. Der PC ist nicht einmal die erste Zeile in den Konstruktor, wenn ich es einen Haltepunkt festlegen.Send
. Auch ist mir aufgefallen, dass meine Anrufe zuKillTimer
falsch sind, aber das sollte keine Rolle spielen, an dieser Stelle, weil, wie es ist, der PC wird nie dort. Danke.