DLL

 

 

维基百科

(http://zh.wikipedia.org/wiki/%E5%8A%A8%E6%80%81%E9%93%BE%E6%8E%A5%E5%BA%93)

 

动态链接库Dynamic Link Library 或者Dynamic-link library ,缩写为DLL ),又称为动态连结库 ,是微软公司微软视窗 操作系统 中实现共享函数库 概念的一种实作方式。这些库函数的扩展名.DLL.OCX (包含ActiveX 控制的库)或者.DRV (旧式的系统驱动程序 )。

所谓动态链接,就是把一些经常会共用的代码(静态链接的OBJ 程序库)制作成DLL档,当可执行文件调用到DLL档内的函数时,windows操作系统才会把DLL档加载存储器内,DLL档本身的结构就是可可执行文件,当程序需求函数才进行链接。通过动态链接方式,存储器浪费的情形将可大幅降低。

DLL的文档格式与视窗EXE 文档一样——也就是说,等同于32位 视窗的可移植执行文档 (PE)和16位 视窗的New Executable (NE)。作为EXE格式,DLL可以包括源代码数据资源 的多种组合。

在更广泛的意义上说,任何同样文档格式电脑文件 都可以称作资源DLL 。这样的DLL的例子有有扩展名ICL 为的图标 、扩展名为FONFOT字体 文档。

背景

DLL的最初目的是节约应用程序所需的磁盘和内存空间。在一个传统的非共享库中,一部分代码简单地附加到调用的程序上。如果两个程序调用同一个子程 序,就会出现两份那段代码。相反,许多应用共享的代码能够切分到一个DLL中,在硬盘上存为一个文档,在内存中使用一个实例(instance)。DLL 的广泛应用使得早期的视窗能够运行在紧巴巴的内存条件下。

DLL提供了如模块化 这样的共享库的普通好处。模块化允许仅仅更改几个应用程序共享使用的一个DLL中的代码和数据而不需要更改应用程序自身。这种模块化的基本形式允许如Microsoft OfficeMicrosoft Visual Studio 、甚至微软视窗 自身这样大的应用程序使用较为紧凑的补丁和服务包

模块化的另外一个好处是插件的通用接口使用。单个的接口允许旧的模块与新的模块一样能够与以前的应用程序运行时无缝地集成到一起,而不需要对应用程序本身作任何更改。这种动态扩展的思想在ActiveX 中发挥到了极致。

尽管有这么多的优点,使用DLL也有一个缺点:DLL地狱 ,也就是几个应用程序在使用同一个共享DLL库发生版本冲突。这样的冲突可以通过将不同版本的问题DLL放到应用程序所在的文件夹而不是放到系统文件夹来解决;但是,这样将抵消共享DLL节约的空间。目前,Microsoft .NET 将解决DLL hell问题当作自己的目标,它允许同一个共享库的不同版本并列 共存。由于现代的计算机有足够的磁盘空间和内存,这也可以作为一个合理的实现方法。

 

特征

内存管理

Win32 中,DLL文档按照片段(sections) 进行组织。每个片段有它自己的属性,如可写或是只读、可执行(代码)或者不可执行(数据)等等。

DLL代码段通常被使用这个DLL的进程所共享;也就是说它们在物理内存中占据一个地方,并且不会出现在页面文档 中。如果代码段所占据的物理内存被收回,它的内容就会被放弃,后面如果需要的话就直接从DLL文档重新加载。

与代码段不同,DLL的数据段通常是私有的;也就是说,每个使用DLL的进程都有自己的DLL数据副本。作为选择,数据段可以设置为共享,允许通过这个共享内存区域进行进程间通信 。但是,因为用户权限不能应用到这个共享DLL内存,这将产生一个安全漏洞 ;也就是一个进程能够破坏共享数据,这将导致其它的共享进程异常。例如,一个使用访客账号的进程将可能通过这种方式破坏其它运行在特权账号的进程。这是在DLL中避免使用共享片段的一个重要原因。

当DLL被如UPX 这样一个可执行的packer压缩时,它的所有代码段都标记为可以读写并且是非共享的。可以读写的代码段,类似于私有数据段,是每个进程私有的并且被页面文档备份。这样,压缩DLL将同时增加内存和磁盘空间消耗,所以共享DLL应当避免使用压缩DLL。

符号解析和绑定

DLL输出的每个函数都由一个数字序号唯一标识,也可以由可选的名字标识。同样,DLL引入的函数也可以由序号或者名字标识。对于内部函数来说,只 输出序号的情形很常见。对于大多数视窗API函数来说名字是不同视窗版本之间保留不变的;序号有可能会发生变化。这样,我们不能根据序号引用视窗API函 数。

按照序号引用函数并不一定比按照名字引用函数性能更好:DLL输出表是按照名字排列的,所以对半查找 可以用来在在这个表中根据名字查找这个函数。另外一方面,只有线性查找 才可以用于根据序号查找函数。

将一个可执行文件绑定 到一个特定版本的DLL也是可能的,这也就是说,可以在编译时解析输入函数(imported functions)的地址。对于绑定的输入函数,连结工具保存了输入函数绑定的DLL的时间戳和校验和。在运行时Windows检查是否正在使用同样版 本的库,如果是的话,Windows将绕过处理输入函数;否则如果库与绑定的库不同,Windows将按照正常的方式处理输入函数。

绑定的可执行文件如果运行在与它们编译所用的环境一样,函数调用将会较快,如果是在一个不同的环境它们就等同于正常的调用,所以绑定输入函数没有任 何的缺点。例如,所有的标准Windows应用程序都绑定到它们各自的Windows发布版本的系统DLL。将一个应用程序输入函数绑定到它的目的环境的 好机会是在应用程序安装的过程。

运行时显式链接

对每个DLL来说,Windows存储了一个全局计数器,每多一个进程使用便多额外一个。LoadLibrary与FreeLibrary指令影响 每一个进程内含的计数器;动态连结则不影响。因此借由调用FreeLibrary多次,从存储器反加载一DLL是很重要的。一个进程可以从它自己的VAS 注销此计数器。

DLL文档能够在运行时使用LoadLibrary (或者LoadLibraryEx )API函数进行显式调用,这个的过程微软简单地称为运行时动态调用 。API函数GetProcAddress 根据查找输出名称符号、FreeLibrary 卸载DLL。这些函数类似于POSIX 标准API中的dlopendlsym 、和dlclose

注意微软简单称为运行时动态链接 的运行时隐式链接,如果不能找到链接的DLL 文档,Windows将提示一个错误消息并且调用应用程序失败。应用程序开发人员不能通过编译链接来处理这种缺少DLL 文档的隐式链接问题。另外一方面,对于显式链接,开发人员有机会提供一个完善的出错处理机制。

运行时显式链接的过程在所有语言中都是相同的,因为它依赖于Windows API 而不是语言结构。

 

 

 

 

 

 

 

 

 

百度百科

(http://baike.baidu.com/view/4373.htm)

动态链接 库英文为DLL,是Dynamic Link Library 的缩写形式,DLL 是一个包含可由多个程序 同时使用的代码 和数据的库,DLL不是可执行文件 。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源。多个应用程序 可同时访问内存 中单个DLL 副本的内容。DLL 是一个包含可由多个程序同时使用的代码和数据的库。

定义

通过使用 DLL,程序 可以实现模块化,由相对独立的组件组成。例如,一个计账程序可以按模块来销售。可以在运行时将各个模块加载到主程序中(如果安装了相应模块)。因为模块是彼此独立的,所以程序的加载速度更快,而且模块只在相应的功能被请求时才加载。

  此外,可以更为容易地将更新应用于各个模块,而不会影响该程序的其他部分。例如,您有一个大型 网络游戏,如果把整个数百MB甚至数GB的游戏的代码都放在一个应用程序里,日后的修改工作将会十分费时,而如果把不同功能的代码分别放在数个动态链接库 (DLL)中,您无需重新生成或安装整个程序就可以应用更新。   下表说明了 Windows 操作系统 中的一些作为 DLL 实现的文件:   · ActiveX 控件 (.ocx) 文件   ActiveX 控件的一个示例是日历控件,它使您可以从日历中选择日期。   · 控制面板 (.cpl) 文件   .cpl 文件的一个示例是位于控制面板中的项。每个项都是一个专用 DLL。   · 设备驱动程序 (.drv) 文件   设备驱动程序的一个示例是控制打印到打印机 的打印机驱动程序。

 

DLL 的优点

1、扩展了应用程序 的特性;

2、可以用许多种编程语言 来编写;   

3、简化了软件 项目的管理;   

4、有助于节省内存 ;   

5、有助于资源共享 ;   

6、有助于应用程序的本地化;   

7、有助于解决平台差异;   

8、可以用于一些特殊的目的。windows使得某些特性只能为DLL所用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值