我使用一个第三方dll,回调readNo,但是执行的时候readNo中的this的hwnd总是为空,而且也不能访问CtestDlg中的变量,请问该怎么解决typedef int (WINAPI *setread)(void(CtestDlg::*test1)(char *,char *,char *));
setread dSetReadNo;void readNo(char *a,char *b,char *c);int  CtestDlg::SetReadNo(){
hDll=LoadLibrary(TEXT("xxxxDll.dll"));
dSetReadNo=(setread)GetProcAddress(hDll,"SetReadNo");
   if(dSetReadNo)
 return   dSetReadNo(& CtestDlg::readNo);
   else 
   return -1;
    
}
void CtestDlg::readNo(char *a,char *b,char *c){
        this->SetDlgItemText(IDC_EDIT1,a);  this为空
this->SetDlgItemText(IDC_EDIT2,b);
this->SetDlgItemText(IDC_EDIT3,c);

}

解决方案 »

  1.   

    return  dSetReadNo(& CtestDlg::readNo); 
      set的时候需要传一个hwnd,你传的是函数地址,this都没有对象
      

  2.   

    你的DLL函数类型定义肯定是错的,回调函数必须是静态函数。
      

  3.   

    回cnzdgs:我以前用的是静态的,后来我把它放在一个类里面,发现静态不行
      

  4.   

    typedef void ( __stdcall *DevOnRead)(
      char *telno, 
      char *time,   
      char *DevID   
      );
    int __stdcall SetReadNo(DevOnRead pp);
      

  5.   

    回调函数只能用静态函数(或全局函数),SetReadNo函数没有提供自定义上下文,所以也不能传递对象指针,可以自己用一个全局变量来传递对象指针。
      

  6.   

    函数这样声明:
    static void __stdcall readNo(char *a,char *b,char *c);
      

  7.   


    这样的话如果我要调用SetDlgItemText这样的非静态函数怎么办?
      

  8.   

    给回调函数添加一个参数void *paramstatic void __stdcall readNo(char *a,char *b,char *c, void *param)
    {
    C***Dlg *pDlg = (C***Dlg *)param;
    pDlg->SetDlgItemText();...
    ...

      

  9.   

    你定义一个全局变量,例如CtestDlg* dlg,在调用SetReadNo之前dlg = this,回调函数中用dlg->SetDlgItemText。
      

  10.   

    把你的对话框的对象指针做一个参数传递到readNo里面去