有时候,我们在使用API定时器时,需要使用类的成员函数作为其回调函数,但是,编译器为了保护成员函数,编译是不能通过的。那么我们怎么才能使用类的成员函数作为API定时器的回调函数呢?我们可以嵌入一段汇编代码来绕过编译器的检查。举个例子:
假设我们一个类的成员函数定义为void CALLBACK EXPORT CTestDlg::TimerProc,那么我们在使用API定时器时如果直接这么写是编译通不过的:
::SetTimer(m_hWnd,1,1000,TimerProc);
使用嵌入一段汇编代码的解决方法如下:
TIMERPROC tProc; __asm { mov eax,TimerProc //将TimerProc函数地址存入eax寄存器 mov tProc,eax //将eax寄存器中的值赋值给tProc } ::SetTimer(m_hWnd,1,1000,tProc);
通过这么做,我们可以通过编译了,但是这么做会产生一个问题,当进入TimerProc函数体内,发现this指针为空,而直接调用该函数this指针是正常的。为了解决这个问题,我们可以定义一个全局指针变量pThis,用来全局保存this指针。然后在TimerProc函数体内使用pThis指针访问类的成员变量和成员函数。或者在函数开头使用一段汇编代码,用来纠正this指针:
__asm { mov ecx,pThis //寄存器ecx用来存放this指针的地址 mov this,ecx }
通过以上步骤就解决了使用类的成员函数作为API定时器的回调函数这个问题,当然在编程中不推荐这么使用(有很多替代方法)。