比如有一个类,CXXXDlg,在它的一个成员函数内,我调用了一dll提供的函数,该dll函数需要一个回调函数,无奈我又写了一个全局函数,并将其传给了该dll函数,那么我在这个回调函数中如何调用CXXXDlg的其它成员函数呢(非静态的),我几乎必需要在那个回调函数中调用CXXXDlg的成员函数,一直找不到很好的方法。
注意,那个回调函数的签名也是dll导出函数定死的。
注意,那个回调函数的签名也是dll导出函数定死的。
即回调函数如下
DWORD WINAPI Func( LPVOID lp )
{
CXXXDlg* pdlg = (CXXXDlg*)lp;
pdlg->...
.
.
}
{
CXXXDlg* pdlg = (CXXXDlg *)AfxGetApp->GetSafeHand();
pdlg->...
.
.
}
public:
CXXXDlg(){
instance_ = this;
}
static CXXXDlg* instance_;
static CXXXDlg* GetInstance(){
return instance_;
}
}void Function(){
CXXXDlg::GetInstance()->xxx();
}
其它人的都不行,我上面特别补充一句:注意,那个回调函数的签名也是dll导出函数定死的。
其它人都视而不见,回调函数参数一定要是LPVOID lp 吗?这是扯蛋中的扯蛋。to Oversense(步步文),你这种方法,我目前正在使用,但有一点不放心,就是CWnd指针听说是会变化的,只有窗口句柄不变,那么你第一次instance_ = this;后,到真正使用的时候,instance_就不一定是当前主窗口的指针了,为此,我在每次调用dll函数之前,都执行一次instance_ = this;可是还是不放心,所以才来问的,因为这个dll函数可能会运行很长时间,需要很多次的调用回调函数,那么在这过程中,this指针还会不会和instance_一直一致呢?
{ CMyDlg* pDlg = (CMyDlg*)AfxGetApp()->GetMainWnd();
// 这样是没有问题的
}