比如有一个类,CXXXDlg,在它的一个成员函数内,我调用了一dll提供的函数,该dll函数需要一个回调函数,无奈我又写了一个全局函数,并将其传给了该dll函数,那么我在这个回调函数中如何调用CXXXDlg的其它成员函数呢(非静态的),我几乎必需要在那个回调函数中调用CXXXDlg的成员函数,一直找不到很好的方法。
注意,那个回调函数的签名也是dll导出函数定死的。

解决方案 »

  1.   

    把指向CXXXDlg对象的指针作为参数传递给该回调函数即可
    即回调函数如下
    DWORD WINAPI Func( LPVOID lp )
    {
      CXXXDlg* pdlg = (CXXXDlg*)lp;
      pdlg->...
      .
      .
    }
      

  2.   

    呵呵,直接new一个对象指针不行吗
      

  3.   

    回调函数里没有一个上下文指针么?把这个指针赋成CXXXDlg对象的指针就可以在回调函数里面使用CXXXDlg任意public的成员变量啦。
      

  4.   

    DWORD CALLBACK Func( LPVOID lp )
    {
      CXXXDlg* pdlg =  (CXXXDlg *)AfxGetApp->GetSafeHand();
      pdlg->...
      .
      .
    }
      

  5.   

    class CXXXDlg{
    public:
       CXXXDlg(){
           instance_ = this;
       }
       static CXXXDlg* instance_;
       static CXXXDlg* GetInstance(){
           return instance_;
       }
    }void Function(){
        CXXXDlg::GetInstance()->xxx();
    }
      

  6.   

    我目前用的是Oversense(步步文)的方法,只是我没有用GetInstance类似的函数,因为全局函数可以访问全局变量instance_。
    其它人的都不行,我上面特别补充一句:注意,那个回调函数的签名也是dll导出函数定死的。
    其它人都视而不见,回调函数参数一定要是LPVOID lp 吗?这是扯蛋中的扯蛋。to Oversense(步步文),你这种方法,我目前正在使用,但有一点不放心,就是CWnd指针听说是会变化的,只有窗口句柄不变,那么你第一次instance_ = this;后,到真正使用的时候,instance_就不一定是当前主窗口的指针了,为此,我在每次调用dll函数之前,都执行一次instance_ = this;可是还是不放心,所以才来问的,因为这个dll函数可能会运行很长时间,需要很多次的调用回调函数,那么在这过程中,this指针还会不会和instance_一直一致呢?
      

  7.   

    UINT SocketReceiveThread(LPVOID pParam)
    {     CMyDlg* pDlg = (CMyDlg*)AfxGetApp()->GetMainWnd();
         //  这样是没有问题的
    }
      

  8.   

    注意,那个回调函数的签名也是dll导出函数定死的。我怎么记得这句话原来是没有的。。那我想只能使用全局指针了吧,接口都定死了我也找不到好的办法了。