首页
论坛
课程
招聘
[原创]给DLL函数传递非静态类成员函数指针做回调函数
2011-2-19 20:46 5562

[原创]给DLL函数传递非静态类成员函数指针做回调函数

2011-2-19 20:46
5562
初学C++,所以一直碰到不少问题,但经过努力,最后还是让我给解决了!这是一个关于给DLL传递非静态类成员函数指针做回调函数的问题!

假如有一个类,里面有一个成员函数我们要把他做成回调函数,传递给一个DLL函数,正常情况下是无法实现的,即使实现这一步,还是会出错的,上次在论坛提问的时候,我没有说是给DLL函数传递,所以导致我的这个问题一直还没有解决,今天又研究了一下,才发现奥秘!

首先用内联汇编给DLL传递成员函数指针:(说起来我是突然想起来用内联汇编的,万能的汇编啊!)
		__asm
		{
			mov eax,offset mIn ;假如函数名叫mIn,取出地址
			mov p_mIn,eax ; 放到一个和DLL参数同一类型的变量里
		}
写完这一步的时候,我就自以为成功了,但编译调试后,却在回调函数第一行指令处就中断了下来!
这个打击非常的大!在对出错地方发了N秒的呆后,潜意识的点了下右键,看到"转到反汇编"时,我才想起还可以看反汇编...一直都是源码调试惯了,居然忘记了...然后发现ECX的值传递给ESI,下面一条访问[esi] 但ECX是空值,这时候突然想起书上说的,每个成员函数都会有一个This指针,我才恍然大悟,原来是This指针的缘故啊,这下有办法了,用静态变量申明一个类指针,在构造函数的时候初始化它:

pThis = this;




__asm
{
mov esi,pThis; //本来以为在回调函数前加上一句这个的代码,就可以偷个大懒了
                //没想到编译器太狠了,我用ESI,他就用EDI,我用ESI和EDI,他就用EBX...没办法,看来汇编还不是最强大的..还是规规矩矩的写完整!


}


在该回调函数里面调用其他成员函数的前面加上pThis->即可,终于编译调试成功了!

如果这个回调函数没有调用任何其他成员函数,可能不会出错,但我这个是需要调用其他成员函数的!

现在我知道,this指针的作用了,他不单单是传递给他的成员函数,而且成员函数里面调用其他成员函数都需要this指针来找到!

如果大家碰到这种情况,可以用我这个方法解决,因为本人是新手,如果这个问题在您看来是很简单的话,希望说下您的方法,以免我等菜鸟在走弯路~

[看雪官方培训] Unicorn Trace还原Ollvm算法!《安卓高级研修班》2021年秋季班火热招生!!

收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回