从 MFC DLL 显示对话框

Posted

技术标签:

【中文标题】从 MFC DLL 显示对话框【英文标题】:Show dialog from MFC DLL 【发布时间】:2011-06-14 23:24:20 【问题描述】:

我加载了表单但只有按钮没有功能

HMODULE hModule = LoadLibrary(L"Tools.dll");

if (hModule != NULL)

    AfxSetResourceHandle(hModule);
    CDialog dgl(MAKEINTRESOURCE(199), NULL);
    dgl.DoModal(); 

那么我如何加载表单的完整功能 而且我没有DLL源代码

【问题讨论】:

【参考方案1】:

要显示来自MFC dll 的对话框,如场景 - 您已在 DLL 中导出函数,并从该函数调用 DoModel()。此模板实际上存储在 DLL 模块中。您需要切换模块状态以使当前句柄为使用过。您可以使用:

AFX_MANAGE_STATE(AfxGetStaticModuleState());

AFX_MODULE_STATE AfxGetStaticModuleState()

->The AFX_MODULE_STATE 结构包含模块的全局数据,即被推送或弹出的模块状态部分。

IN DLL 代码会是这样的:

AFX_MANAGE_STATE(AfxGetStaticModuleState());
CMyDlg objMyDlg;
iRet = objMyDlg.DoModal(); 

【讨论】:

【参考方案2】:

只有当您确定对话框类实现是基于 MFC 并且该类是从 Tools.dll 导出时,这才有可能。您可以尝试使用 Dependency Walker 实用程序检查您的 .dll。 请注意编译器会破坏构造函数名称。这就是我得到的以下声明。

class __declspec(dllexport) TestDialog : public CDialog

public:
    TestDialog()
        :CDialog(10)
    

    
;

损坏的构造函数名称:??_7TestDialog@@6B@

您可能能够根据检查结果重新创建对话框类标题。您还应该确保 Tools.dll 和您的应用程序的 MFC 版本相同。

【讨论】:

以上是关于从 MFC DLL 显示对话框的主要内容,如果未能解决你的问题,请参考以下文章

从 .NET C# DLL 更新 MFC 对话框中的进度条

从应用程序对话框访问的 MFC 自定义键盘 DLL

MFC 对话框显示在任务栏中

从非托管 C++ mfc active x dll 启动 C# 对话框

如何从 mfc dll 加载 ActiveX dll

创建共享 MFC 对话框:常规 DLL 或 MFC 扩展 DLL