22.4 MFC扩展DLL的创建与使用实例
MFC常规DLL是使用MFC但是导出的接口不支持MFC的DLL,而MFC扩展DLL则是内部既使用MFC,导出的接口也支持MFC的DLL,解决了要在DLL和EXE之间传递从MFC派生而来的类的问题。本节介绍MFC扩展DLL的创建和使用实例。
22.4.1 MFC扩展DLL的创建
MFC扩展DLL实现继承子MFC类库中的已经存在的类,完成可重复使用的类的DLL。扩展DLL使用MFC的动态链接版本,也就是MFC共享版本。只有使用MFC共享版本生成的MFC可执行文件(应用程序或规则DLL),可以使用扩展DLL。使用扩展DLL可以从MFC中继承新的自定义类,并为应用程序提供扩展的MFC版本。
DLL的客户端EXE必须是使用_AFXDLL编译的MFC应用程序。
动态链接到MFC的规则DLL也可以使用扩展DLL。
扩展DLL也可以使用_AFXEXT定义进行编译,强制定义_AFXDLL,并保证正确的特性。使得当生成DLL时,AFX_EXT_CLASS定义为__declspec(dllexport),如果在扩展DLL中使用宏声明类则是必需的。
扩展DLL不会实例化从CwinApp继承的类,但是依赖于客户端应用程序或DLL提供对象。
扩展DLL也提供一个DllMain()函数,并进行必需的初始化工作。
扩展DLL使用MFC的动态链接版本生成(也就是共享MFC版本)。只有使用共享版本MFC的MFC可执行程序(应用程序或规则DLL)才可以使用扩展DLL。无论是客户端应用程序还是扩展DLL,必须使用相同的MFC.DLL版本。
扩展DLL可以在应用程序和DLL之间传递派生自MFC的对象。在对象创建的模块中与传入对象相关的成员函数也会传入。因为当使用共享MFC的DLL版本时,这些函数被正确地导出,可以在应用程序和导入的扩展DLL之间自由地传递MFC或派生的MFC对象指针。
MFC扩展DLL使用共享版本的MFC与应用程序使用共享版本的DLL的方法是相同的,但是也有不同之处。
没有继承子CwinApp的派生类。必须与客户端应用程序的CwinApp派生对象一起工作。也就是说,客户端应用程序处理主消息队列、空闲队列等。
在DllMain()函数中调用AfxInitExtensionModule()函数,并检测此函数的返回值。如果此函数返回0,则从DllMain()函数中返回0。
如果扩展DLL想导出应用程序的CruntimeClass对象或资源,则会在初始化时,创建CdynLinkLibrary对象。
如果使用DEF文件导出,在头文件的开头和结尾处放置以下代码。
- #undef AFX_DATA
- #define AFX_DATA AFX_EXT_DATA
- // 头文件体
- #undef AFX_DATA
- #define AFX_DATA
这4行可以保证扩展DLL中的代码正确编译。如果没有这4行,会导致DLL编译或链接不正确。创建MFC扩展DLL的方法与创建MFC常规DLL的步骤基本是相同的,只是在创建MFC DLL的第一步中,选择DLL的类型为MFC Extension DLL(using)shared MFC DLL选项,则创建的DLL就是MFC扩展DLL。