【发布时间】:2011-06-30 17:46:03
【问题描述】:
我正在尝试从 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
【问题讨论】:
-
我认为
CreateIndirect是用于无模式对话框的?在调用DoModal之前,您可能需要InitModalIndirect,但显示您的代码会很有帮助。该问题不太可能出现在 MFC 调试断言中,而是使用中的错误导致断言失败。 -
您可能想阅读 Pat Brenner(MS 高级 MFC 工程师)的 cmets here...
标签: c++ dll mfc dialog modal-dialog