在 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链接