我做了一个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

解决方案 »

  1.   

    可以在DLL里给窗体发消息呀,自定义一个消息,给CTestDlg定义它的处理函数,在ReportMessage里PostMessage 或SendMessage都可以,我以前这样用过
      

  2.   

    噢!好象我理解错了,ReportMessage是回调用
    那就在需要告知主程序状态的地方PostMessage 或SendMessage
    不过好象成主动的了
      

  3.   

    呵呵,不能发消息的,因为调用者可能是一个服务,这种情况下是无法发消息的。
    我跟踪了一下,发现((CTestDlg * )AfxGetMainWnd()) 的返回值是零,后来使切换了
    模块环境还是不行,不知道为什么?
      

  4.   

    不同模块的情况下最好不要用AfxGetMainWnd()
    用AfxGetApp()->GetMainWnd()代替一下
      

  5.   

    而且要注意在多线程下使用MFC类,尽量用窗口句柄代替。
      

  6.   

    void CTestDlg::SetMessage(CString mes)
    {
        m_str=mes;//这里就出现错误了 m_str 是CTestDlg中的成员    this->UpdateData(FALSE);}//回调函数改成这样试试
    void ReportMessage(UINT KeywordID, char * message, CTestDlg *pDlg)//回调函数在DLL中被调用
    {
         pDlg->SetMessage(message);     return;
    }
    AfxGetMainWnd()这个函数是和线程相关的。每个线程都有一个MainWnd。