我做了一个DLL 进行后台处理,为了让DLL的调用者能知道DLL的处理的结果,我让调用者提供一个回调函数。(回调函数是在EXE中)。结果在回调函数中处理一些问题就失败了。程序结构如下:void CTestDlg::SetMessage(CString mes)
{
m_str=mes;//这里就出现错误了 m_str 是CTestDlg中的成员this->UpdateData(FALSE);}void ReportMessage(UINT KeywordID, char * message)//回调函数在DLL中被调用
{((CTestDlg * )AfxGetMainWnd())->SetMessage(message);return;
}DLL 中有消息的时候,通过ReportMessage函数的指针调用void ReportMessage(UINT KeywordID, char * message)函数,结果在SetMessage中
m_str=mes;就出错了,出错信息是:
unhandle exception access violation
{
m_str=mes;//这里就出现错误了 m_str 是CTestDlg中的成员this->UpdateData(FALSE);}void ReportMessage(UINT KeywordID, char * message)//回调函数在DLL中被调用
{((CTestDlg * )AfxGetMainWnd())->SetMessage(message);return;
}DLL 中有消息的时候,通过ReportMessage函数的指针调用void ReportMessage(UINT KeywordID, char * message)函数,结果在SetMessage中
m_str=mes;就出错了,出错信息是:
unhandle exception access violation
那就在需要告知主程序状态的地方PostMessage 或SendMessage
不过好象成主动的了
我跟踪了一下,发现((CTestDlg * )AfxGetMainWnd()) 的返回值是零,后来使切换了
模块环境还是不行,不知道为什么?
用AfxGetApp()->GetMainWnd()代替一下
{
m_str=mes;//这里就出现错误了 m_str 是CTestDlg中的成员 this->UpdateData(FALSE);}//回调函数改成这样试试
void ReportMessage(UINT KeywordID, char * message, CTestDlg *pDlg)//回调函数在DLL中被调用
{
pDlg->SetMessage(message); return;
}
AfxGetMainWnd()这个函数是和线程相关的。每个线程都有一个MainWnd。