初学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指针来找到!

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