动态链接库的生成和链接_第1页
动态链接库的生成和链接_第2页
动态链接库的生成和链接_第3页
动态链接库的生成和链接_第4页
动态链接库的生成和链接_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、动态链接库的生成和链接1引言动态链接库英文为DLL,是DynamicLinkLibrary的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库,动态链接库使进程可以调用不属于其可执行代码的函数,还有助于共享数据和资源。当程序使用DLL时,具有的优点如下:(1)使用较少的资源当多个程序使用同一个函数库时,DLL可以减少在磁盘和物理内存中加载的代码的重复量。使前台的程序得到良好的运行,而且可以大大减少对其它程序的影响。(2)推广模块式体系结构DLL有助于促进模块式程序的开发,这可以帮助您开发要求提供多个语言版本的大型程序或要求具有模块式体系结构的程序。(3)简化部署和安装当DLL中的函

2、数需要更新或修复时,部署和安装DLL不要求重新建立程序与该DLL的链接。此外,如果多个程序使用同一个DLL,那么多个程序都将从该更新或修复中获益。当您使用定期更新或修复的第三方DLL时,会大大简化程序的更新步骤。DLL在程序开发中具有无可替代的作用,本文介绍了DLL的生成和链接。2动态链接库的生成和链接动态链接库其实就是为应用程序提供服务并具有某一特定功能的函数和类的集合,与它相对的是静态链接库。静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。但是若使用DLL,该DLL不必被包含在最终EXE文件中,EXE文件

3、执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。下面简要的介绍一下在VC下可以生成的动态链接库的分类。2.1 动态链接库的分类使用VC模板可以生成以下三种不同类型的DLL:(l)Win32DLL只能导出C函数和变量,但可以使用除CObject派生的类。不能在导出函数中建立对话框,因为不能进行模块环境转换。(2) MFC常规DLL只能导出C函数和变量,但可以使用MFC中所有的类,在使用DLL中的资源时要进行模块环境转换,在每个要导出的函数最前面

4、加上AFX_MANAGE_STATE(AfxGetStaticModuleState(),也可以使用以下人工转换:HINSTANCEhCurContext=AfxGetResourceHandle();AfxSetResourceHandle(GetModuleHandleC'temp.dll);可以使用DLL中的资源了。HRSRChRes=FindResource(hCurContext,MAKEINTRES0URCE(129),RT_DIAL0G);可以创建窗口了AfxSetResourceHandle(hCurContext);另外标准C语言中不支持重载,因为C语言的调用协定(_

5、cdecl)生成的代码中函数名只有一个_(下划线)做前缀,所有该类型的DLL不能导出重载函数。(3) MFC扩展DLL支持C+接口,可以导出C+类,成员函数及重载函数,只支持动态MFC库。每一个DLL必须有一个入口点,DllMain是一个缺省的入口函数。dllMain负责初始化(Initialization)和结束(Termination)工作,每当一个新的进程或者该进程的新的线程访问DLL时,或者访问DLL的每一个进程或者线程不再使用DLL或者结束时,都会调用DllMain。但是,使用TerminateProcess或TerminateThread结束进程或者线程,不会调用DllMain。下

6、面以一个简单的小程序为例,说明动态动态链接库的生成和链接。2.2 动态链接库的生成动态链接库的生成有两种方法:在MyDll.h添加:extern"C_declspec(dllexport)intMax(inta,intb);externC_declspec(dllexport)intMin(inta,intb);在MyDLL.cpp中添加:#includeMyDll.hintMax(inta,intb)。要实现的功能代码intMin(inta,intb)要实现的功能代码(2)用.def文件创建工程MyDll为了用.def文件创建DLL,请先删除上个例子创建的工程中的MyDll.h文件

7、,保留MyDll.cpp并在该文件头删除includeMyDll.h语句,同时往该工程中加入一个文本文件,命名为MyDll.def,再在该文件中加入如下代码:LIBRARYMyDllEXPORTSMaxMin其中LIBRARY语句说明该def文件是属于相应DLL的,EXPORTS语句下列出要导出的函数名称。我们可以在.def文件中的导出函数后加n,如MaxLMin2,表示要导出的函数顺序号,在进行显式连时可以用到它。该DLL编译成功后,打开工程中的Debug目录,同样也会看到MyDll.dll和MyDll.lib文件。2.3 动态链接库的链接应用程序使用DLL可以采用两种方式:一种是隐式链接,

8、另一种是显式链接。在使用DLL之前首先要知道DLL中函数的结构信息。VisualC+6.0在VCbin目录下提供了一个名为Dumpbin.exe的小程序,用它可以查看DLL文件中的函数结构。另外,Windows系统将遵循下面的搜索顺序来定位DLL:包含EXE文件的目录;进程的当前工作目录;Windows系统目录;Windows目录;列在Path环境变量中的一系列目录。(1)隐式链接(2)显式链接显式链接是应用程序在执行过程中随时可以加载DLL文件,也可以随时卸载DLL文件,这是隐式链接所无法作到的,所以显式链接具有更好的灵活性,对于解释性语言更为合适。不过实现显式链接要麻烦一些。在应用程序中用

9、LoadLibrary或MFC提供的AfxLoadLibrary显式的将自己所做的动态链接库调进来,动态链接库的文件名即是上述两个函数的参数,此后再用GetProcAddressO获取想要引入的函数。自此,你就可以象使用如同在应用程序自定义的函数一样来调用此引入函数了。在应用程序退出之前,应该用FreeLibrary或MFC提供的AfxFreeLibrary释放动态链接库。下面是通过显式链接调用DLL中的Max函数的例子。使用显式链接应用程序编译时不需要使用相应的Lib文件。另外,使用GetProcAddressO函数时,可以利用MAKEINTRESOURCEO函数直接使用DLL中函数出现的顺序号,如将GetProcAddress(hDLL,改为GetProcAddress(hDLL,MAKEINTRES0URCE(2)(函数Min()在DL

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论