有时候,我们在使用API定时器时,需要使用类的成员函数作为其回调函数,但是,编译器为了保护成员函数,编译是不能通过的。那么我们怎么才能使用类的成员函数作为API定时器的回调函数呢?我们可以嵌入一段汇编代码来绕过编译器的检查。举个例子:
假设我们一个类的成员函数定义为void CALLBACK EXPORT CTestDlg::TimerProc,那么我们在使用API定时器时如果直接这么写是编译通不过的:
1
::SetTimer(m_hWnd,1,1000,TimerProc);
使用嵌入一段汇编代码的解决方法如下:
1
2
3
4
5
6
7
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指针:
1
2
3
4
5
__asm
{
mov ecx,pThis //寄存器ecx用来存放this指针的地址
mov this,ecx
}
通过以上步骤就解决了使用类的成员函数作为API定时器的回调函数这个问题,当然在编程中不推荐这么使用(有很多替代方法)。
阅读(2245) | 评论(0) | 转发(0) |