SUMMARY
Many of the Win32 application programming interfaces (APIs) call for a
callback routine. One example is the lpStartAddr argument of
CreateThread():
HANDLE CreateThread(lpsa, cbStack, lpStartAddr, lpvThreadParm,
LPSECURITY_ATTRIBUTES lpsa; /* Address of thread security attrs */
DWORD cbStack; /* Initial thread stack size*/
LPTHREAD_START_ROUTINE lpStartAddr; /* Address of thread function */
LPVOID lpvThreadParm; /* Argument for new thread*/
DWORD fdwCreate; /* Creation flags*/
LPDWORD lpIDThread; /* Address of returned thread ID */
When attempting to use a member function as the thread function, the
following error is generated:
error C2643: illegal cast from pointer to member
The problem is that the function expects a C-style callback, not a pointer
to a member function. A major difference is that member functions are
called with a hidden argument called the "this" pointer. In addition, the
format of the pointer isn't simply the address of the first machine
instruction, as a C pointer is. This is particularly true for virtual
functions.
If you want to use a member function as a callback, you can use a static
member function. Static member functions do not receive the "this" pointer
and their addresses correspond to an instruction to execute.
Static member functions can only access static data, and therefore to
access nonstatic class members, the function needs an object or a pointer
to an object. One solution is to pass in the "this" pointer as an argument
to the member function.