什么是动态链接库

什么是动态链接库?


一、动态链接库的概念
    动态链接库(Dynamic Link Library ,缩写为DLL )是一个可以被其它应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源。动态链接库文件的扩展名一般是dll , 也有可能是drvsysfon ,它和可执行文件(exe )非常类似,区别在于DLL 中虽然包含了可执行代码却不能单独执行,而应由Windows 应用 程序直接或间接调用。

   动态链接是相对于静态链接而言的。所谓静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分。换句话说,函数和过程的代码就在 程序的exe 文件中,该文件包含了运行时所需的全部代码。当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝,这样就浪费了宝贵的内存资源。 而动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息)。仅当应用程序 被装入内存开始运行时,在Windows 的管理下,才在应用程序与相应的DLL 之间建立链接关系。当要执行所调用DLL 中的函数时,根据链接产生的重定位 信息,Windows 才转去执行DLL 中相应的函数代码。

   一般情况下,如果一个应用程序使用了动态链接库,Win32 系统保证内存中只有DLL 的一份复制品,这是通过内存映射文件实现的。DLL 首先被调入 Win32 系统的全局堆栈,然后映射到调用这个DLL 的进程地址空间。在Win32 系统中,每个进程拥有自己的32 位线性地址空间,如果一个DLL 被多个 进程调用,每个进程都会收到该DLL 的一份映像。与16Windows 不同,在Win32DLL 可以看作是每个进程自己的代码。

  
二、动态链接库的优点

   1 共享代码、资源和数据

    使用DLL 的主要目的就是为了共享代码,DLL 的代码可以被所有的Windows 应用程序共享。

   2
隐藏实现的细节

    DLL 中的例程可以被应用程序访问,而应用程序并不知道这些例程的细节。

   3
拓展开发工具如Delphi 的功能

   由于DLL 是与语言无关的,因此可以创建一个DLL ,被C++VB 或任何支持动态链接库的语言调用。这样如果一种语言存在不足,就可以通过访问另一种语言创建的DLL 来弥补。

  
三、动态链接库的实现方法

   1 Load-time Dynamic Linking

   这种用法的前提是在编译之前已经明确知道要调用DLL 中的哪几个函数,编译时在目标文件中只保留必要的链接信息,而不含DLL 函数的代码;当程序执行时,利用链接信息加载DLL 函数代码并在内存中将其链接入调用程序的执行空间中,其主要目的是便于代码共享。

   2 Run-time Dynamic Linking

   这种方式是指在编译之前并不知道将会调用哪些DLL 函数,完全是在运行过程中根据需要决定应调用哪个函数,并用LoadLibraryGetProcAddress 动态获得DLL 函数的入口地址。



教你认识动态链接库DLL 文件


    DLLDynamic Link Library 的缩写,意为动态链接库。在Windows 中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL 文件,放置于系统中。当我们执行某一个程序时,相应的DLL 文件就会被调用。一个应用程序可有多个DLL 文件,一个DLL 文件也可能被几个应用程序所共 用,这样的DLL 文件被称为共享DLL 文件。DLL 文件一般被存放在C:WindowsSystem 目录下。


  
1 、如何了解某应用程序使用哪些DLL 文件

   右键单击该应用程序并选择快捷菜单中的 快速查看 命令,在随后出现的 快速查看 窗口的 引入表 一栏中你将看到其使用DLL 文件的情况。

  
2 、如何知道DLL 文件被几个程序使用

   运行Regedit ,进入HKEY_LOCAL_MACHINESoftwareMicrosrftWindowsCurrent-
VersionSharedDlls
子键查看,其右边窗口中就显示了所有DLL 文件及其相关数据,其中数据右边小括号内的数字就说明了被几个程序使用,(2 )表示被两个程序使用,(0 )则表示无程序使用,可以将其删除。

  
3 、如何解决DLL 文件丢失的情况

    有时在卸载文件时会提醒你删除某个DLL 文件可能会影响其他应用程序的运行。所以当你卸载软件时,就有可能误删共享的DLL 文件。一旦出现了丢失DLL 文 件的情况,如果你能确定其名称,可以在Sysbckup (系统备份文件夹)中找到该DLL 文件,将其复制到System 文件夹中。如果这样不行,在电脑启 动时又总是出现“***dll 文件丢失……” 的提示框,你可以在 开始/ 运行 中运行Msconfig ,进入系统配置实用程序对话框以后,单击选择 “System.ini” 标签,找出提示丢失的DLL 文件,使其不被选中,这样开机时就不会出现错误提示了。

dll 文件与lib 文件的关系

(1)lib 是编译时需要的,dll 是运行时需要的。
如果要完成源代码的编译,有lib 就够了。
如果也使动态连接的程序运行起来,有dll 就够了。
在开发和调试阶段,当然最好都有。
(2) 一 般的动态库程序有lib 文件和dll 文件。lib 文件是必须在编译期就连接到应用程序中的,而dll 文件是运行期才会被调用的。如果有dll 文件,那么对 应的lib 文件一般是一些索引信息,具体的实现在dll 文件中。如果只有lib 文件,那么这个lib 文件是静态编译出来的,索引和实现都在其中。静态编译 的lib 文件有好处:给用户安装时就不需要再挂动态库了。但也有缺点,就是导致应用程序比较大,而且失去了动态库的灵活性,在版本升级时,同时要发布新的 应用程序才行。
(3) 在动态库的情况下,有两个文件,一个是引入库(.LIB )文件,一个是DLL 文件, 引入库文件包含被DLL 导出的函数的名称和位置,DLL 包含实际的函数和数据,应用程序使用LIB 文件链接到所需要使用的DLL 文件,库中的函数和数据并 不复制到可执行文件中,因此在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL 中所要调用的函数的内存地址,这样当一个或多个应用程序运 行是再把程序代码和被调用的函数代码链接起来,从而节省了内存资源。从上面的说明可以看出,DLL.LIB 文件必须随应用程序一起发行,否则应用程序将 会产生错误。

猜你喜欢

转载自eggbucket.iteye.com/blog/1136605