《第13章:动态链接库.ppt》由会员分享,可在线阅读,更多相关《第13章:动态链接库.ppt(31页珍藏版)》请在第壹文秘上搜索。
1、Visual C+Visual C+第三篇第三篇VCVC编程高级篇编程高级篇基于组件的编程与应用基于组件的编程与应用 VC不仅能进行结构化的程序设计,还能进行面向对象的程序设计。基于组件的程序设计就是解决不同程序语言开发的程序差异而出现的一种程序设计方法。在VC程序中,不仅可以开发组件供自己或别的程序语言来调用,而且还可以使用别的程序语言开发的组件。本篇主要讲解利用VC编制组件和调用组件的方法与原理,主要包括编制动态链接库和COM组件、调用VC自己开发的动态链接库和COM组件,以及结合数据库应用程序的开发,阐述了如何使用Microsoft的ADO数据访问组件来编写高效数据库客户端应用程序。Vi
2、sual C+Visual C+第第1313章章动态链接库动态链接库13.1 动态链接库概述13.2 动态链接库的创建 13.3 动态链接库的显式调用 习题Visual C+Visual C+13.113.1 动态链接库概述动态链接库概述 动态链接库提供了一种代码共享机制,它可以有效地减小程序文件的尺寸和不必要的重复工作。本章以一个包含递归分形树函数的本章以一个包含递归分形树函数的.DLLDLL的建立为例,重点讲解了动态链接库的建立方法,在的建立为例,重点讲解了动态链接库的建立方法,在VCVC中显式调中显式调用用.DllDll的方法的方法。13.1.113.1.1 动态链接库定义动态链接库定义
3、 13.1.213.1.2 静态链接与动态链接静态链接与动态链接13.1.313.1.3 函数的导出与导入函数的导出与导入13.1.413.1.4 隐式链接与显式链接隐式链接与显式链接13.1.513.1.5 搜索动态链接库搜索动态链接库 *13.1.613.1.6使用动态链接库的优点使用动态链接库的优点Visual C+Visual C+13.1.113.1.1动态链接库定义动态链接库定义 动态链接库(Dynamic Link Library,简称DLL)是一个包含了若干函数的可执行模块,它实质上是一个函数包,Windows应用程序可以调用这些函数来完成实际的任务。DLL在Windows环境
4、中起着重要的作用Windows 利用 DLL来建立Windows应用程序可以使用的Windows函数与资源。动态链接库是一个文件,其中包含有函数或全局变量,使用他们就像应用程序使用自己定义的函数一样。用API开发Windows应用程序,实质就是调用Windows操作系统下的动态链接库。Visual C+Visual C+13.1.213.1.2静态链接与动态链接静态链接与动态链接 DLL与运行函数库(如C语言的运行函数库)类似,二者主要二者主要区别区别在于库代码的链接时机不同。静态链接库在多任务环境中建立与运行时效率可能很低。一方面一方面,如果两个应用程序同时运行,且它们使用了同一个静态库中的
5、函数,那么就要求系统中出现该函数的两个副本,这显然降低了内存的使用效率。另一方面另一方面,对于比较复杂的问题,应用静态链接库将导致最终的应用程序长度超过系统内存而无法运行。DLL DLL是在运行期间才被链接进来,该操作由是在运行期间才被链接进来,该操作由WindowsWindows操作系统自操作系统自身来完成,而运行函数库则是在程序链接期间由应用程序的链接器身来完成,而运行函数库则是在程序链接期间由应用程序的链接器如如LINK.EXELINK.EXE来完成,运行函数库的链接被称为来完成,运行函数库的链接被称为“静态链接静态链接”,它把,它把函数代码链接到应用程序中,增加了应用程序最终执行代码的
6、长度。函数代码链接到应用程序中,增加了应用程序最终执行代码的长度。它的主要优点是建立了一个应用程序可以利用的标准函数集,这样它的主要优点是建立了一个应用程序可以利用的标准函数集,这样在开发应用程序时就无需包含函数库中所包含的函数源代码。在开发应用程序时就无需包含函数库中所包含的函数源代码。Visual C+Visual C+13.1.213.1.2静态链接与动态链接静态链接与动态链接 (续)(续)与静态链接库不同,动态链接库则允许若干个应用程序共享某个函数的单个副本。事实上,每个Windows API函数,如GetMesssage()、CreateWindow()和TextOut()分别留于动
7、态链接库 Kernel32.dll、User32.dll、Gdi32.dll之中。如果两个应用程序同时运行,且都使用了某个特定的Windows函数,那么它们将共享该函数代码的单个副本。DLL除了实现代码的共享外,还可以实现其它资源的共享,如数据和硬件资源的共享。Windows的设备驱动程序允许应用程序共享硬件资源,这些设备驱动程序就是以动态链接库的形式来出现。从某种程度上讲,动态链接库也是一种类型的计算机资源。一个动态链接库可以为多个应用程序使用,如果一个应用程序使用了某个动态链接库中函数,若库不存在,则调用将不能完成。Visual C+Visual C+13.1.313.1.3函数的导出与导
8、入函数的导出与导入 动态链接库是一个.DLL文件,它存放在特定的位置上(13.1.5节讲)。程序员所创建的动态链接库中的函数要有导出标志,在使用动态链接库中的函数的程序中,要具有导入标志。动态链接库中的函数并不是杂乱无章地堆放在一起,它们都有一个标志,即动态链接库中的导出标志。同样,如果应用程序要使用该库中的函数,也要向动态链接库发出“是否有我们想要的函数”,这通过导入标志来进行。双方必须达成一致后才能使用。Visual C+Visual C+13.1.313.1.3函数的导出与导入函数的导出与导入(续)1通过扩展关键字dllexport 与dllimport 指定 从一个动态链接库中导出一个
9、函数可以通过如下的语句来完成 _declspec(dllexport)void MyFunction(int i)/动态链接库中的函数MyFunction的实现代码 其中_declspec是一个扩展关键字,其作用和具有一个参数的函数类似,实际 上,它 与 它 的“参 数”一 起 构 成 了 一 个“标 志”,即“_declspec(dllexport)”,该语句的含义为“出现在我后面的函数在当前的动态链接库文件中被合法导出,外部应用程序可以使用这个函数”。从一个动态链接库中导入一个函数可以通过如下的语句来完成 _declspec(dllimpot)void MyFunction(int i);
10、_declspec(dllimpot)的含义为“出现在我后面的函数MyFunction是从动态链接库文件中导入的函数”。Visual C+Visual C+13.1.313.1.3函数的导出与导入函数的导出与导入(续)2通过DEF文件指定 动态链接库DLL是通过导出函数和变量来实现代码共享的,外部程序能通过这个导出过程来访问内部的函数和变量。在VC下,除了使用编译指令dllexport 与dllimport 实现导出、导入函数的指定外,还可以通过DLL工程中的DEF文件来实现,利用应用程序向导生成的动态链接库中有一个和工程名同名的一个.def文件,例如建立一个在mydll.dll的动态链接库,
11、则生成的mydll.def的主要内容如下:(1)Def的内容;mydllmydll.def:Declares the module parameters for the DLL.def:Declares the module parameters for the DLL.LIBRARY LIBRARY mydllmydll DESCRIPTION DESCRIPTION mydllmydll Windows Dynamic Link Library Windows Dynamic Link LibraryEXPORTSEXPORTS;Explicit exports can go here;E
12、xplicit exports can go here;以下为用户手工填写的代码,它代表导出的函数名为DrawTree DrawTreeVisual C+Visual C+13.1.313.1.3函数的导出与导入函数的导出与导入(续)(2)Def的内容说明 AppWizard生成的mydll.def文件包含了关于DLL在Windows下运行的一些信息。在这个文件中定义了一些参数,包括DLL的名称和属性,还声明了从DLL中输出的函数。动态链接库的DEF文件中的注释行标志符和.cpp文件不一样,它用分号“;”表示,而不是用双斜线“/”表示。第一行语句:第一行语句:LIBRARY LIBRARY m
13、ydllmydll 表示要建立的动态链接库文件的名称为“myDll”,加在语句EXPORT后面的代码DrawTree表示可以被其它应用程序调用的函数。语句EXPORT表示其后面的函数都可以被与该动态链接库链接的EXE应用程序调用。Visual C+Visual C+13.1.413.1.4隐式链接与显式链接隐式链接与显式链接 1隐式链接 若在代码中没有明确指定应用程序要装入的动态链接库,但却使用其中的某个函数,这种链接的方式称为隐式链接。利用VC可以编写各种DLL程序,其最终目的是在应用程序中调用DLL。链接DLL到可执行程序有两种方式两种方式:隐式链接(Implicit linking)显式
14、链接(Explicit linking)Visual C+Visual C+13.1.413.1.4隐式链接与显式链接隐式链接与显式链接(续)2显式链接 显示链接,又称显式调用又称显式调用,是由编程者用API函数LoadLibrary()加载DLL、并通过GetProcessAddress()来获取应用程序要调用的导出函数指针来调用DLL的导出函数,最后通过FreeLibrary()卸载DLL。它是一种动态调用的方式,通过它能够有效地使用内存,是编制大型应用程序的重要方式。Visual C+Visual C+13.1.513.1.5搜索动态链接库搜索动态链接库 在隐式调用的应用程序运行时,需要
15、寻找它所用的动态链接库,并且把它们加载到进程的虚拟地址空间内,为了使应用程序正常地使用动态链接库,必须将.DLL文件存放在下列任何一个子目录中,Windows操作系统也是按照下列顺序来搜索动态链接库的:(1)程序所在的当前目录(包含EXE可执行文件的目 录);(2)进程的当前工作目录;(3)Windows系统目录(如C:WindowsSystem子目录);(4)Windows目录(如C:Windows子目录);(5)在Path环境变量中列出的一系列目录。Visual C+Visual C+*13.1.613.1.6使用动态链接库的优点使用动态链接库的优点 动态链接库非常有利于软件的编写和更新,
16、在编写程序时,可以把一个大型软件项目分割为多个单独模块,在这些模块中定义好它们的调用关系,然后分别由多个程序员进行编写。在各个模块内,程序员可以充分发挥他们的创造性,优化程序代码。而且,利用动态链接库对于软件的更新也是非常有好处的。在更新或者升级这个软件时,可以只更新这个软件的动态链接库。现代应用程序广泛地使用动态链接库,其好处好处是:(1 1)同时运行的多个应用程序可以同时使用同一个动态链接库,它们在内存中只是共享DLL文件的一个拷贝。(2 2)只要编写的应用程序函数、变量和返回值的类型和数量不发生变化,动态链接库中的函数可以不用重新编译链接而且直接使用,这一点明显优于静态链接;(3 3)只要遵循一定的规则,不同语言编写的应用程序可以调用同一个动态链接库,而不管这个函数执行什么操作;(4 4)在设计应用程序时,将其拆分成功能相互独立的部件.DLL,为以后对这些功能部件各自升级提供较方便的途径;(5 5)使资源数据独立于可执行程序之外,但又能较方便快速地访问它。Visual C+Visual C+13.213.2 动态链接库的创建动态链接库的创建 13.2.1 13.2.1 动态链接库