我正在尝试编译一个包含 CDialog 表单的 DLL。具体来说,我想包括包含布局和所有公共方法的资源。
主要目标是导出表单(及其方法)以在外部环境中使用它,而不会弄乱现有表单的 IDD。
我(一整天)的研究没有显示任何可能的解决方案,而且由于我是使用 MFC 编程 C++ 的新手,我不知道如何开始。
谢谢你的支持!
我是使用 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 断言。