【问题标题】:Can't create modal dialog from MFC DLL无法从 MFC DLL 创建模式对话框
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    • 2015-06-30
    • 1970-01-01
    相关资源
    最近更新 更多