《7动态链接库1》由会员分享,可在线阅读,更多相关《7动态链接库1(12页珍藏版)》请在金锄头文库上搜索。
1、动态链接库动态链接库1通用模块的设计方法通用模块的设计方法n n库函数库函数n n静态链接静态链接n n基于源代码级的代码共享基于源代码级的代码共享n n动态链接库动态链接库n n动态链接动态链接n n二进制代码级共享二进制代码级共享2DLL的特点的特点lDLL以动态方式与应用程序链接。以动态方式与应用程序链接。l多个应用程序共享多个应用程序共享DLL的一个副本,减少了的一个副本,减少了数据在内存中的交换。数据在内存中的交换。lDLL能够防止重复开发,方便系统升级。能够防止重复开发,方便系统升级。l大型应用程序中,采用大型应用程序中,采用DLL进行模块划分。进行模块划分。3DLL的类型的类型l
2、Win32 DLLAn empty DLL projectA simple DLL projectA DLL that exports some symbolslMFC DLLRegular DLL with MFC statically linkedRegular DLL using shared MFC DLLMFC Extension DLL(using shared MFC DLL)4DLL的导出的导出n导出函数导出函数n导出数据导出数据n导出类导出类5导出函数导出函数l使用使用 .def 文件导出函数文件导出函数;MyDll.def : Declares the module par
3、ameters for the DLL.LIBRARY“MyDll”DESCRIPTIONMyDll Windows DLLEXPORTSFUNC1FUNC2FUNC36u在在创创建建DLLDLL时时,编编译译链链接接器器先先使使用用defdef文文件件创创建建两两个个文文件件:一一个个导导出出文文件件(. .EXPEXP)和和一一个个导导入入库库文文件(件(. .LIBLIB),),然后使用导出文件再创建然后使用导出文件再创建DLLDLL文件。文件。u导导入入库库文文件件中中存存放放了了外外部部应应用用程程序序可可导导入入的的DLLDLL导导出出函函数数名名称称的的列列表表,函函数数的的代代
4、码码则则存存放放在在DLLDLL文件中。文件中。u外外部部应应用用程程序序使使用用的的文文件件是是导导入入库库文文件件和和DLLDLL文文件。件。7l使用关键词使用关键词_declspec(dllexport)导出函数导出函数_declspec(dllexport) void func();_declspec(dllimport) void func();l使用使用AFX_EXT_CLASS宏导出类中的成员函数。宏导出类中的成员函数。AFX_EXT_CLASS void func();8导出数据导出数据l使用使用 .def 文件中的关键字文件中的关键字DATAEXPORTSnVariableD
5、ATAl使用关键词使用关键词_declspec(dllexport)_declspec(dllexport) int j;_declspec(dllexport) class X nVariable;9导出类导出类l使用使用AFX_EXT_CLASS宏导出类。宏导出类。class AFX_EXT_CLASS CMyDllClass;l使用关键词使用关键词_declspec(dllexport)导出类导出类class _declspec(dllexport) CMyDllClass;10DLL的链接的链接l隐式链接(静态加载):隐式链接(静态加载): 即应用程序先链接到编译即应用程序先链接到编译
6、DLL时生成的导入时生成的导入库库LIB文件,并且文件,并且DLL一直存在于该程序运一直存在于该程序运行进程的地址空间中。行进程的地址空间中。l隐式链接必须包含以下三个文件:隐式链接必须包含以下三个文件:(1)包含导出函数以及类声明的头文件)包含导出函数以及类声明的头文件(2)DLL的导入库的导入库LIB文件文件(3)实际的)实际的DLL文件文件11(1)调用)调用LoadLibrary()或AfxLoadLibrary()加载加载DLL并得到一个模块句柄。并得到一个模块句柄。HINSTANCE LoadLibrary(LPCTSTR lpLib)(2)调用)调用GetProcAddress()获取导出函数的指针。获取导出函数的指针。FARPROC GetProcAddress(HMODULE hModule,LPCSTR lpProcName)(3)调用调用FreeLibrary()或或AfxFreeLibrary()释放释放DLLBOOL FreeLibrary(HINSTANCE hInstLib)l 显式链接显式链接12