无法从MFC DLL创建模态对话框

时间:2011-06-30 17:46:03

标签: c++ dll mfc dialog modal-dialog

我正在尝试从MFC应用程序加载的DLL启动模式对话框。我正在使用VS2010,EXE和DLL都在静态库中使用MFC。

我在我的DLL中调用DoModal()来启动对话框,其中父对象是从MFC应用程序指向主窗口的CWnd *。对话框资源位于DLL中。

这最终会导致MFC库函数CWnd::CreateDlgIndirect,它具有此调试检查:

#ifdef _DEBUG
    if ( AfxGetApp()->IsKindOf( RUNTIME_CLASS( COleControlModule ) ) )
    {
        TRACE(traceAppMsg, 0, "Warning: Creating dialog from within a COleControlModule application is not a supported scenario.\n");
    }
#endif

AfxGetApp()返回NULL,因此调试检查中的代码失败。如果我在发布中编译,会出现对话框,但似乎不起作用(即使我设置了默认值,所有字段都是空的,但是没有出现某个按钮)。

我尝试将AFX_MANAGE_STATE(AfxGetStaticModuleState());添加到启动对话框的函数顶部,但它没有任何区别。

我错过了什么?

编辑:这是我用来调用对话框的代码。

HMODULE oldResMod = AfxGetResourceHandle();

AFX_MANAGE_STATE(AfxGetStaticModuleState());
AfxSetResourceHandle(GetThisModule());

CWnd wndParent;
wndParent.Attach(parent);

CExportOptionsDlg dlg(&wndParent);
dlg.project_name = project->GetName();

if (dlg.DoModal() != IDOK)
{
    wndParent.Detach();
    AfxSetResourceHandle(oldResMod);
    return false;       // cancelled
}

// ... (get some data from the dialog members) ...

wndParent.Detach();
AfxSetResourceHandle(oldResMod);
return true;            // OK

1 个答案:

答案 0 :(得分:1)

检查您是否在当前模块(DLL / EXE)中的某处创建了CWinApp。

每个模块都应该只有一个CWinApp对象。通常,您可以将CWinApp对象设置为全局变量,以便在分别加载和卸载模块时创建和销毁它。