c++ - MFC从DLL导入对话框

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

我有两个项目:一个 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 ,以便它可以完全模块化。我怎样才能做到这一点?

最佳答案

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

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

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

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

关于c++ - MFC从DLL导入对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29803627/

相关文章:

visual-studio-2008 - 在项目级别禁用 C++ 警告?

c++ - 在 Visual Studio 中为多个体系结构构建 Bullet Physics

c# - 在 .NET 中动态添加引用

c++ - 我可以暂停除一个线程之外的进程吗?

c++ - 如何正确使用SDL_MOUSEBUTTONDOWN?

c++ - 对于 C++ 中的多个数组,for 循环不能正常工作

c# - 从 C# 调用带有 char* 的 C++ 函数

c++ - 如何在 vc++ 6 中使用 mfc 标记选中的菜单项?

java - UnsatisfiedLinkError "Access is denied"即使完全控制

c++ - OpenGl 纹理太暗