首页 > 代码库 > 使用类的成员函数作为API定时器的回调函数

使用类的成员函数作为API定时器的回调函数

      有时候,我们在使用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定时器的回调函数这个问题,当然在编程中不推荐这么使用(有很多替代方法)。