我正在尝试从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
答案 0 :(得分:1)
检查您是否在当前模块(DLL / EXE)中的某处创建了CWinApp。
每个模块都应该只有一个CWinApp对象。通常,您可以将CWinApp对象设置为全局变量,以便在分别加载和卸载模块时创建和销毁它。