欢迎来到天天文库
浏览记录
ID:19885569
大小:407.00 KB
页数:42页
时间:2018-10-07
《第九讲 动态链接库》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第九讲动态链接库主讲:吕骏动态链接库定义动态链接库(DynamicLinkLibrary,简称DLL)是一个包含了若干函数的可执行模块,它实质上是一个函数包,Windows应用程序可以调用这些函数来完成实际的任务。DLL在Windows环境中起着重要的作用——Windows利用DLL来建立Windows应用程序可以使用的Windows函数与资源。动态链接库(DLL)是从C语言函数库的概念发展而来的。几乎所有的WindowsAPI都包含在DLL中动态链接库是一个文件,其中包含有函数或全局变量,使用他们就像应用程序使用自己定义的函数一样。用API开发Win
2、dows应用程序,实质就是调用Windows操作系统下的动态链接库。它包含函数,数据或资源等其他应用程序可用到的东西它可以在需要的时候随时装入,Windows操作系统都非常依赖于动态链接库(DLL)中的函数和数据,实际上Windows操作系统中几乎所有的内容都由DLL以一种或另外一种形式代表着。我们在Windows目录下的system32文件夹中会看到kernel32.dll、user32.dll和gdi32.dll,windows的大多数API都包含在这些DLL中。kernel32.dll中的函数主要处理内存管理和进程调度;user32.dll中的函
3、数主要控制用户界面;gdi32.dll中的函数则负责图形方面的操作。例如一般的程序员都用过类似MessageBox的函数,其实它就包含在user32.dll这个动态链接库中。由此可见DLL对我们来说其实并不陌生。静态链接与动态链接DLL与运行函数库(如C语言的运行函数库)类似,二者主要区别在于库代码的链接时机不同。静态链接库在多任务环境中建立与运行时效率可能很低。一方面,如果两个应用程序同时运行,且它们使用了同一个静态库中的函数,那么就要求系统中出现该函数的两个副本,这显然降低了内存的使用效率。另一方面,对于比较复杂的问题,应用静态链接库将导致最终
4、的应用程序长度超过系统内存而无法运行。DLL是在运行期间才被链接进来,该操作由Windows操作系统自身来完成,而运行函数库则是在程序链接期间由应用程序的链接器如LINK.EXE来完成,运行函数库的链接被称为“静态链接”,它把函数代码链接到应用程序中,增加了应用程序最终执行代码的长度。它的主要优点是建立了一个应用程序可以利用的标准函数集。静态链接库多个应用程序,多个静态链接库的副本占用较多的内存资源在静态库情况下,函数和数据被编译进一个二进制文件(通常扩展名为*.LIB)VisualC++的编译器在处理程序代码时将从静态库中恢复这些函数和数据并把他们和
5、应用程序中的其他模块组合在一起生成可执行文件"静态链接",此时因为应用程序所需的全部内容都是从库中复制了出来,所以静态库本身并不需要与可执行文件一起发行与静态链接库不同,动态链接库则允许若干个应用程序共享某个函数的单个副本。事实上,每个WindowsAPI函数,如GetMesssage()、CreateWindow()和TextOut()分别留于动态链接库——Kernel32.dll、User32.dll、Gdi32.dll之中。如果两个应用程序同时运行,且都使用了某个特定的Windows函数,那么它们将共享该函数代码的单个副本。DLL除了实现代码的共
6、享外,还可以实现其它资源的共享,如数据和硬件资源的共享。Windows的设备驱动程序允许应用程序共享硬件资源,这些设备驱动程序就是以动态链接库的形式来出现。从某种程度上讲,动态链接库也是一种类型的计算机资源。一个动态链接库可以为多个应用程序使用,如果一个应用程序使用了某个动态链接库中函数,若库不存在,则调用将不能完成。动态链接库DLL的优点共享DLL,节省内存,减少动态交换不同程序设计语言之间可以共享DLL减少可执行代码大小重用代码大工程可分为易管理的小工程实现新功能更容易、软件升级在动态库的情况下,有两个文件引入库(.LIB)文件DLL文件引入库文件
7、包含被DLL导出的函数的名称和位置DLL包含实际的函数和数据应用程序使用LIB文件链接到所需要使用的DLL文件隐式链接与显式链接1.隐式链接若在代码中没有明确指定应用程序要装入的动态链接库,但却使用其中的某个函数,这种链接的方式称为隐式链接。利用VC可以编写各种DLL程序,其最终目的是在应用程序中调用DLL。链接DLL到可执行程序有两种方式:隐式链接(Implicitlinking)显式链接(Explicitlinking)2.显式链接显示链接,又称显式调用,是由编程者用API函数LoadLibrary()加载DLL、并通过GetProcessAddr
8、ess()来获取应用程序要调用的导出函数指针来调用DLL的导出函数,最后通过FreeLibra
此文档下载收益归作者所有