码迷,mamicode.com
首页 > Windows程序 > 详细

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

时间:2014-08-15 13:00:09      阅读:254      评论:0      收藏:0      [点我收藏+]

标签:成员函数   定时器   回调函数   汇编   settimer   

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

使用类的成员函数作为API定时器的回调函数,布布扣,bubuko.com

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

标签:成员函数   定时器   回调函数   汇编   settimer   

原文地址:http://jincheng.blog.51cto.com/4625177/1540376

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!