VC++动态链接库编程之MFC扩展 DLL.doc
《VC++动态链接库编程之MFC扩展 DLL.doc》由会员分享,可在线阅读,更多相关《VC++动态链接库编程之MFC扩展 DLL.doc(10页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、VC+动态链接库编程之MFC扩展 DLL资料引用:DLL类型入口函数 非 MFC DLL 编程者提供DllMain函数 MFC规则 DLL CWinApp对象的InitInstance 和 ExitInstance MFC扩展 DLL MFC DLL向导生成DllMain 函数对于MFC扩展DLL,系统会自动在工程中添加如下表所示的宏,这些宏为DLL和应用程序的编写提供了方便。像AFX_EXT_CLASS、AFX_EXT_API、AFX_EXT_DATA这样的宏,在DLL和应用程序中将具有不同的定义,这取决于_AFXEXT宏是否被定义。这使得在DLL和应用程序中,使用统一的一个宏就可以表示出输
2、出和输入的不同意思。在DLL中,表示输出(因为_AFXEXT被定义,通常是在编译器的标识参数中指定/D_AFXEXT);在应用程序中,则表示输入(_AFXEXT没有定义)。宏定义 AFX_CLASS_IMPORT _declspec(dlleXPort) AFX_API_IMPORT _declspec(dllexport) AFX_DATA_IMPORT _declspec(dllexport) AFX_CLASS_EXPORT _declspec(dllexport) AFX_API_EXPORT _declspec(dllexport) AFX_DATA_EXPORT _declspec
3、(dllexport) AFX_EXT_CLASS #ifdef _AFXEXTAFX_CLASS_EXPORT#elseAFX_CLASS_IMPORT AFX_EXT_API #ifdef _AFXEXTAFX_API_EXPORT#elseAFX_API_IMPORT AFX_EXT_DATA #ifdef _AFXEXTAFX_DATA_EXPORT#elseAFX_DATA_IMPORT6.2 MFC扩展DLL导出MFC派生类在这个例子中,我们将产生一个名为“ExtDll”的MFC扩展DLL工程,在这个DLL中导出一个对话框类,这个对话框类派生自MFC类CDialog。使用MFC向导
4、生成MFC扩展DLL时,系统会自动添加如下代码:static AFX_EXTENSION_MODULE ExtDllDLL = NULL, NULL ;extern C int APIENTRYDllMain( HINSTANCE hInstance, DWord dwReason, LPVOID lPReserved )/ Remove this if you use lpReservedUNREFERENCED_PARAMETER( lpReserved );/说明:lpReserved是一个被系统所保留的参数,对于隐式链接是一个非零值,对于显式链接值是零if (dwReason = DL
5、L_PROCESS_ATTACH)TRACE0( EXTDLL.DLL Initializing!n );/ Extension DLL one-time initializationif ( !AfxInitExtensionModule( ExtDllDLL, hInstance )return 0;/ Insert this DLL into the resource chainnew CDynLinkLibrary( ExtDllDLL );else if (dwReason = DLL_PROCESS_DETACH)TRACE0( EXTDLL.DLL Terminating!n )
6、;/ Terminate the library before destrUCtors are calledAfxTermExtensionModule( ExtDllDLL );return 1; / ok这一段代码含义晦涩,我们需要对其进行解读:(1)上述代码完成MFC扩展DLL的初始化和终止处理;(2)初始化期间所创建的 CDynLinkLibrary 对象使MFC扩展 DLL 可以将 DLL中的CRuntimeClass 对象或资源导出到应用程序;(3)AfxInitExtensionModule函数捕捉模块的CRuntimeClass 结构和在创建 CDynLinkLibrary 对
7、象时使用的对象工厂(COleObjectFactory 对象);(4)AfxTermExtensionModule函数使 MFC 得以在每个进程与扩展 DLL 分离时(进程退出或使用AfxFreeLibrary卸载DLL时)清除扩展 DLL;(5)第一条语句static AFX_EXTENSION_MODULE ExtDllDLL = NULL, NULL ;定义了一个AFX_EXTENSION_MODULE类的静态全局对象,AFX_EXTENSION_MODULE的定义如下:struct AFX_EXTENSION_MODULEBOOL bInitialized;HMODULE hModul
8、e;HMODULE hResource;CRuntimeClass* pFirstSharedClass;COleObjectFactory* pFirstSharedFactory;由AFX_EXTENSION_MODULE的定义我们可以更好的理解(2)、(3)、(4)点。在资源编辑器中添加一个如图15所示的对话框,并使用MFC类向导为其添加一个对应的类CExtDialog,系统自动添加了ExtDialog.h和ExtDialog.cpp两个头文件。图15 MFC扩展DLL中的对话框修改ExtDialog.h中CExtDialog类的声明为:class AFX_EXT_CLASS CExtD
9、ialog : public CDialogpublic:CExtDialog( CWnd* pParent = NULL ); enum IDD = IDD_DLL_DIALOG ;protected:virtual void DoDataExchange( CDataExchange* pDX ); DECLARE_MESSAGE_MAP();这其中最主要的改变是我们在class AFX_EXT_CLASS CExtDialog语句中添加了“AFX_EXT_CLASS”宏,则使得DLL中的CExtDialog类被导出。 6.3 MFC扩展DLL的加载6.3.1 隐式加载我们在6.2工程所在
10、的工作区中添加一个LoadExtDllDlg工程,用于演示MFC扩展DLL的加载。在LoadExtDllDlg工程中添加一个如图16所示的对话框,这个对话框上包括一个“调用DLL”按钮。图16 MFC扩展DLL调用工程中的对话框 在与图16对应对话框类实现文件的头部添加:/ LoadExtDllDlg.cpp : implementation file/#include .ExtDialog.h#pragma comment( lib, ExtDll.lib )而“调用DLL”按钮的单击事件的消息处理函数为:void CLoadExtDllDlg:OnDllcallButton() CExtD
11、ialog extDialog;extDialog.DoModal();当我们单击“调用DLL”的时候,弹出了如图15的对话框。为提供给用户隐式加载(MFC扩展DLL一般使用隐式加载,具体原因见下节),MFC扩展DLL需要提供三个文件:(1)描述DLL中扩展类的头文件;(2)与动态链接库对应的.LIB文件;(3)动态链接库.DLL文件本身。有了这三个文件,应用程序的开发者才可充分利用MFC扩展DLL。6.3.2 显示加载显示加载MFC扩展DLL应使用MFC全局函数AfxLoadLibrary而不是WIN32 API中的LoadLibrary。AfxLoadLibrary 最终也调用了 Load
12、Library这个API,但是在调用之前进行了线程同步的处理。AfxLoadLibrary 的函数原型与 LoadLibrary完全相同,为:HINSTANCE AFXAPI AfxLoadLibrary( LPCTSTR lpszModuleName );与之相对应的是,MFC 应用程序应使用AfxFreeLibrary 而非FreeLibrary 卸载MFC扩展DLL。AfxFreeLibrary的函数原型也与 FreeLibrary完全相同,为:BOOL AFXAPI AfxFreeLibrary( HINSTANCE hInstLib );假如我们把上例中的“调用DLL”按钮单击事件的
13、消息处理函数改为:void CLoadExtDllDlg:OnDllcallButton() HINSTANCE hDll = AfxLoadLibrary( ExtDll.dll );if(NULL = hDll)AfxMessageBox( MFC扩展DLL动态加载失败 );return;CExtDialog extDialog;extDialog.DoModal();AfxFreeLibrary(hDll);则工程会出现link错误:LoadExtDllDlg.obj : error LNK2001: unresolved external symbol _declspec(dllimp
14、ort) public: virtual _thiscall CExtDialog:CExtDialog(void) (_imp_?1CExtDialogUAEXZ)LoadExtDllDlg.obj : error LNK2001: unresolved external symbol _declspec(dllimport) public: _thiscall CExtDialog:CExtDialog(class CWnd *) (_imp_?0CExtDialogQAEPAVCWndZ)提示CExtDialog的构造函数和析构函数均无法找到!是的,对于派生MFC类的MFC扩展DLL,当
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC+动态链接库编程之MFC扩展 DLL VC 动态 链接 编程 MFC 扩展
限制150内