在 Visual C++ DLL 中包含 MFC 资源(CDialog-Form)

Posted

技术标签:

【中文标题】在 Visual C++ DLL 中包含 MFC 资源(CDialog-Form)【英文标题】:Include MFC-Resource (CDialog-Form) in Visual C++ DLL 【发布时间】:2015-01-20 15:14:52 【问题描述】:

我正在尝试编译一个包含 CDialog 表单的 DLL。 具体来说,我想包括包含布局和所有公共方法的资源。

主要目标是导出表单(及其方法)以在外部环境中使用它,而不会弄乱现有表单的 IDD。

我(一整天)的研究没有显示任何可能的解决方案,而且由于我是使用 MFC 编程 C++ 的新手,我不知道如何开始。

感谢您的支持!

【问题讨论】:

欢迎来到 ***!您能否更具体地说明您的问题是什么?到目前为止,您尝试过什么? 您好 Nate,我尝试使用 VS2010 创建一个 DLL 项目,它可以开箱即用地编译和工作 - 那就是我现在被卡住了。下一步必须做的是“导入”现有的表单(代码和资源),但我不知道,这样做时必须考虑什么,以免陷入死胡同。我不期望“解决方案”,而是希望找到我可以遵循的方向。 【参考方案1】:

我是使用 MFC 编程 C++ 的新手,我不知道如何获得 开始了。

开始吧...您可能已经准备好采取其中的一些措施了。

实现此目的的一种方法是创建一个头文件,该文件可用于指导代码的导出和导入。例如,在对话框类的头文件中,如果您编写类似的代码,

#ifdef DllImpExp
#undef DllImpExp
#endif

#ifdef SomeDefineWeWillUseToControlImportExport
#define DllImpExp   __declspec( dllexport )
#else
#define DllImpExp   __declspec( dllimport )
#endif

相同的标题可用于导出和导入对话框类。然后,您的对话框类的声明应指定“DllImpExp”。例如,

class DllImpExp SomeClass : public SomeBaseClass

创建 dll 的项目中,您将为“SomeDefineWeWillUseToControlImportExport”添加预处理器定义。这会强制编译器导出您的对话框类代码。此时,您的对话框类已准备好被另一个对象使用。

自从你导出了你的类,你的 dll 项目已经创建了一个同名的导入库。该库用作您想在其中使用对话框代码的其他项目的输入。有几种方法可以做到这一点,但是,只需将该 lib 列为要使用它的项目的链接器的输入就可以了。此外,您不能在项目中定义“SomeDefineWeWillUseToControlImportExport”,以便导入该类。

至于访问 dll 中的对话框资源,您需要采取一些特殊步骤。在尝试显示对话框之前,您需要将当前资源句柄指向包含该资源的 dll。您的应用使用单个 句柄 来了解加载资源的位置(即对话框)。由于您在一个或多个位置有对话框,因此您需要使用两个函数来管理它。您需要使用AfxGetResourceHandle 来保存用于加载资源的当前默认句柄。然后,查看AfxSetResourceHandle 以更改默认句柄以从您的 dll 加载。并且,当您从 dll 中处理完对话框后,不要忘记恢复保存的句柄。不这样做可能会导致一些奇怪的 mfc 断言。

【讨论】:

以上是关于在 Visual C++ DLL 中包含 MFC 资源(CDialog-Form)的主要内容,如果未能解决你的问题,请参考以下文章

在 MFC dll 中包含 boost mutex 头文件时断言

使用 Visual Studio 2010 在 dll 项目中包含 Qt 工具

在 Visual Studio MFC 中,我可以在组合框中包含文本但在代码中获取 int 吗?

在DLL中包含OpenVDB;将错误与Visual Studio 2015链接

Visual C++:从 DLL 调用时 XGBoost 不起作用

使用 C++ 和 Visual Studio 2008 的 MFC DLL