【问题标题】:MFC import Dialog from DLLMFC 从 DLL 导入对话框
【发布时间】:2015-06-30 11:15:06
【问题描述】:

我有两个项目:一个 MFC .exe 和一个 MFC .dll。我在 DLL 中定义了一个 MFC 对话框。它有一个与之关联的资源,它还有一个派生自CDialog 的类CToolboxDiag

对话框有一个简单的按钮,点击时会显示一个消息对话框。

void CToolboxDiag::OnBnClickedButton()
{
   MessageBox(_T("Test"), _T("T"));
}

我可以将资源从 DLL 导出到我的代码中,并使用以下代码创建具有正确外观的标准 CDialog

CDialog *diag = new CDialog;

HINSTANCE hClientResources = AfxGetResourceHandle();

//Tell the client to use the .DLL's resources
AfxSetResourceHandle(dll);

// resource_id is the resource_id in the DLL
diag->Create(resource_id, NULL);

//Restore the client application resource handle
AfxSetResourceHandle(hClientResources);

但这只会导致显示对话框,但控件(即按钮)在单击时不执行任何操作,因为它没有链接到 .exe 中的CToolboxDiag 定义。

我想导出对话框(带有按钮代码),而不必将类定义导出到 .exe。换句话说,我想导出一个功能齐全的对话框,包括它的按钮操作,而我的 .exe 上没有 CToolboxDialog 定义,这样它就可以完全模块化。我怎么能这样做?

【问题讨论】:

  • 把 AFX_MANAGE_STATE(AfxGetStaticModuleState());在调用 dll 函数时
  • @SantoshDhanawade 是的,谢谢。但我想知道的是如何从 DLL 中导入 fhole 对话框功能

标签: c++ visual-c++ dll mfc


【解决方案1】:

这不能以这种方式工作。资源模板与 DLL 中的代码没有直接联系。您的代码刚刚创建了一个没有处理程序的“空” CDialog 类,期待默认处理程序(OnOk,OnClose...)

因此您需要创建对象 CToolboxDiag,这必须发生在对话框代码所在的位置。这是在 DLL 中。

最简单的方法是导出一个仅在 DLL 中创建对话框并将 CDialog* 返回到您的应用程序的函数。

请注意,仅当您使用 MFC 的 DLL 共享版本时,才允许这样做并且不会出现问题。

【讨论】:

  • 我试过了,还是不行。当我返回一个指向 CDialog 的指针时,它在 .exe 上下文中是无效的,并导致很多断言错误。也许你有一些例子?
  • 由于某种原因,这在某些 InternalDllMain 函数中崩溃了,当我使用 LoadLibrary 导入 DLL 时它会崩溃。使应用程序崩溃的函数是AfxWinInit,当我导入 Dll 时会调用它。你有什么提示吗?
猜你喜欢
  • 2011-03-16
  • 1970-01-01
  • 1970-01-01
  • 2018-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多