从MFC DLL显示对话框

时间:2011-06-14 23:24:21

标签: c++ dll mfc loadlibrary cdialog

我加载了表单,但只加了没有函数的按钮

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

if (hModule != NULL)
{
    AfxSetResourceHandle(hModule);
    CDialog dgl(MAKEINTRESOURCE(199), NULL);
    dgl.DoModal(); 
}

所以如何加载表单的完整功能 我没有DLL源代码

2 个答案:

答案 0 :(得分:2)

要显示来自MFC dll的对话框,就像场景一样 - 您已经在DLL中导出了函数,并从该函数中调用DoModel()。此模板实际存储在DLL模块中。您需要切换模块状态为要使用的当前句柄。您可以使用以下方法执行此操作:

AFX_MANAGE_STATE(AfxGetStaticModuleState());

AFX_MODULE_STATE AfxGetStaticModuleState()

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

在DLL代码中将是这样的:

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

答案 1 :(得分:0)

只有在确定对话框类实现是基于MFC并且从Tools.dll导出类时,才可以执行此操作。您可以尝试使用Dependency Walker实用程序检查.dll 请注意编译器修改构造函数名称。这就是我对以下声明的看法。

class __declspec(dllexport) TestDialog : public CDialog
{
public:
    TestDialog()
        :CDialog(10)
    {

    }
};

Mangled构造函数名称:?? _ 7TestDialog @@ 6B @

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