我创建了一个MFC Regular DLL using shared MFC DLL,在其中插入了一个对话框 (CEmu),然后在该项目中定义了一个API函数:BOOL WINAPI TestAboutBox()
{
CEmu mu;
int a = mu.DoModal();

return TRUE;
}调用该函数时,对话框无法显示出来,上面函数中 DoModal() 的返回值为-1,跟踪进去,看到 m_hDialogTemplate 的值为 NULL。请问这是怎么回事?非常感谢您的帮助!

解决方案 »

  1.   

    DLL中要使用无模式对话框。
    定义全局变量CEmu * m_pDlg;
    在需要创建的时候m_pDlg = new CEmu(),然后调用窗口显示函数m_pDlg->ShowWindow
      

  2.   

    谢谢孤星飞雨!
    按你说的改了之后,还是出错:Debug Assertion Failed!File: winocc.cpp
    Line: 301
      

  3.   

    执行了 new CEmu() 啦。如果不执行,出的不会是这样的错了。
      

  4.   

    BOOL WINAPI TestAboutBox(HWND hMainWnd)
    {
    CEmu mu(CWnd::FromHandle(hMainWnd));
    int a = mu.DoModal();return TRUE;
    }hMainWnd--->主程序传过来的窗口句柄。
      

  5.   

    http://www.codeguru.com/cpp/w-p/dll/article.php/c101/看看这个
      

  6.   

    To 太太平洋兄弟: 传了父窗口的句柄也没用哦。To 风之羽翼:对话框资源创建了,否则就不是这样的错误信息了。
      

  7.   

    在函数开始调用一下AFX_MANAGE_STATE(AfxGetStaticModuleState())试试,不知道行不行。
      

  8.   

    extern __declspec(dllexport) void ShowEditDialog(int &MyData1, int &MyData2)
    {
    DWORD dwLastErr = NO_ERROR; //
    // surround the code in brackets, which will cause the temporary
    // object created by AFX_MANAGE_STATE to be destroyed before leaving
    // the exported function.
    //
    // NOTE : Do NOT call MFC code outside of these brackets.
    //
    {
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    CMyLocalDialog dlg;
    dlg.Arg1 = MyData1; //specific local data for MyLocalDialog
    dlg.Arg2 = MyData2;
    dlg.DoModal();
    MyData1 = dlg.Arg1; //data after processing
    MyData2 = dlg.Arg2; //
    // save possible errors
    //
    dwLastErr = ::GetLastError();
    } //
    // only set error if none is currently set.
    // (last error will always be NO_ERROR _unless_
    // TlsGetValue failed earlier)
    //
    if (::GetLastError() == NO_ERROR)
    ::SetLastError(dwLastErr);
    }
      

  9.   

    问题解决:BOOL WINAPI TestAboutBox()
    {
        AFX_MANAGE_STATE(AfxGetStaticModuleState());
        CEmu mu(AfxGetMainWnd());
        int a = mu.DoModal();    return TRUE;
    }
    我是从 wshcdr(dd) 给的链接页面里看到的链接中找到的解决办法:http://support.microsoft.com/default.aspx?scid=kb;EN-US;194300非常感谢 wshcdr(dd)!
      

  10.   

    BOOL WINAPI TestAboutBox(HWND hMainWnd)
    {
    CEmu mu(CWnd::FromHandle(hMainWnd));
    int a = mu.DoModal();return TRUE;
    }
    //  mu是局部变量
    在TestAboutBox返回的时候
    它的生命期已经结束了你可以动态创建这个对话框
    CEmu *mu = new CEmu();
    mu->create(参数);
    mu->ShowWindow(SW_SHOW);
    并在函数的开始处加上
    AFX_MANAGE_STATE(AfxGetStaticModuleState())
    试试行不行