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

时间:2015-01-20 15:14:52

标签: c++ forms dll mfc cdialog

我正在尝试编译包含CDialog表单的DLL。 详细地说,我想包含包含布局和所有公共方法的资源。

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

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

感谢您的支持!

1 个答案:

答案 0 :(得分:0)

  

我是使用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用作您想要使用对话框代码的其他项目的输入。有几种方法可以做到这一点,但是,简单地将lib列为想要使用它的项目的链接器的输入应该可行。此外,您不能在项目中定义“SomeDefineWeWillUseToControlImportExport”,以便导入该类。

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