Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1568485
  • 博文数量: 157
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 4116
  • 用 户 组: 普通用户
  • 注册时间: 2013-06-14 18:26
文章分类

全部博文(157)

文章存档

2014年(67)

2013年(90)

分类: 网络与安全

2014-08-15 11:37:52

有时候,我们在使用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) |
给主人留下些什么吧!~~