DLL之工作原理

DLL之工作原理
 DLL是什么?就是动态链接库的英文Dynamic Link Library的简称。不过要说明一点的是:动态链接库的一般扩展名为DLL,也有可能是.drw(设备驱动程序),.sys(系统文件)和.fon(字体文件);但是不是说所有.drw(设备驱动程序)、.sys(系统文件)和.fon(字体文件)都是DLL。

  动态链接库(DLL)是从C语言函数库和Pascal库单元的概念发展而来的。所有的C语言标准库函数都存放在某一函数库中,同时用户也可以用LIB程序创建自己的函数库。在链接应用程序的过程中,链接器从库文件中拷贝程序调用的函数代码,并把这些函数代码添加到可执行文件中。这种方法与只把函数储存在已编译的.OBJ文件中相比,更有利于代码的重用。

  但随着Windows这样的多任务环境的出现,函数库的方法显得过于累赘。如果为了完成屏幕输出、消息处理、内存管理、对话框等操作,每个程序都不得不拥有自己的函数,那么Windows程序将变得非常庞大。Windows的发展要求允许同时运行的几个程序共享一组函数的单一拷贝。动态链接库就是在这种情况下出现的。动态链接库不用重复编译或链接,一旦装入内存,Dlls函数可以被系统中的任何正在运行的应用程序软件所使用,而不必再将DLLs函数的另一拷贝装入内存。

  “动态链接”这几字指明了DLL是如何工作的。对于常规的函数库,链接器从中拷贝它需要的所有库函数,并把确切的函数地址传送给调用这些函数的程序。而对于DLL,函数储存在一个独立的动态链接库文件中。在创建Windows程序时,链接过程并不把DLL文件链接到程序上。直到程序运行并调用一个DLLs中的函数时,该程序才要求这个函数的地址。此时Windows才在DLL中寻找被调用函数,并把它的地址传送给调用程序。一般情况下,如果一个应用程序使用了动态链接库,Win32系统保证内存中只有DLL的一份复制品,这是通过内存映射实现的。DLL首先被调入Win32系统的全局堆栈,然后映射到调用这个DLL的进程的地址空间。在Win32系统中,每个进程拥有自己的32位线性地址空间。如果一个DLL被多个进程调用,每个进程都会被分配一份该DLL的映像。当没有程序使用它时,系统就将它移出内存,减少了对内存和磁盘的要求。采用这种方法,DLL达到了复用代码的极限。

  Windows本身就是由大量的动态链接库支持的。这包括Windows API函数(KRNLx86.EXE,USER.EXE,GDI.EXE…),各种驱动程序文件,各种带有.fon和.fot 扩展名的字体资源文件等。Windows还提供了针对某一功能的专用DLLs,如进行DDE编程的ddeml.dll,进行程序安装的ver.dll等。事实上,我们使用的API函数都是调用的Windows中的三个核心DLL文件Kernel32.dll、User32.dll、Gdi32.dll中的例程,这三个核心DLL中的例程绝大部分是用C++编写的。Kernel32.dll负责管理内存、进程和线程。User32.dll包含了一些例程,用于实现用户界面、创建窗口和处理Win32消息。Gdi32.dll负责处理图像。

  在磁盘上,一个动态链接库和一个可执行文件(EXE)十分类似,动态链接库虽然不是EXE文件,却属于Windows可执行文件,虽然不象EXE文件那样可以直接执行,但它包含的可执行代码是由EXE文件调用的。DLL中一般由程序通用的过程、函数等构成,当然也可以包括各种资源。不带DLL的独立EXE文件的编译是在编译的过程中将需要的函数、过程及其它数据从编译过的单元、静态库中提取出来放在EXE文件中,这样以后EXE文件运行时就不再需要www.it8g.com其它的文件支持;使用DLL的EXE文件在编译时,编译器将把程序中使用的DLL中的例程(函数、过程)、数据(图片、字符串等资源)等建立一个列表放在EXE中,也就是说,当EXE运行时,若需要使用外部的例程或数据就会从这个列表中指定的位置去到DLL文件中寻找,这样就不需要在EXE文件存放这些代码,所以EXE文件体积就会很小,只不过发行时需要带着DLL文件。

  说了这么多,大家应该知道了使用DLL的最大的优点——共享资源、代码和数据。DLL不仅提供了函数重用的机制,而且提供了数据共享的机制。任何应用程序都可以共享由装入内存的DLLs管理的内存资源块。只包含共享数据的DLL称为资源文件,如Windows的字体文件等。不同的程序使用相同的DLL,只需将DLL在内存中装载一次,可节约系统内存;对于一些复杂的算法、窗体等,如果是多个程序都需要的,可以放在DLL中,减少了可执行文件的大小;DLL文件独立于编程语言,也就是说用某种语言编写的DLL文件可以被其它的编程语言调用,比如用Delphi编写的DLL可以被VC、VB等使用。

  动态链接库的另一个方便之处是对动态链接库中函数的修改可以自动传播到所有调用它的程序中,而不必对程序作任何改动或处理。DLL可以用于支持世界各国的语言。开发者可以将依赖于语言的函数和资源分离出来,专门放进DLL中,例如中文、英文、法文等。各地使用软件的用户可以安装或运行适当的DLL,以获取正确的本地信息。这是实现软件商品国际化的一项技术。将一些功能模块做成DLL后,如果需要对系统进行升级,只要将个别DLL进行升级,然后用新的DLL文件覆盖掉旧的DLL文件就可以了,而不需要将整个系统进行重新编译和链接。

 

自己的总结:

1. DLL 由4部分构成:代码段,数据段,输出符号表和输入符号表。

2. 当多个应用程序调用DLL时,内存只中保留DLL的代码段和共享数据段(须声明),每个应用程序拷贝非共享数据段到自己的进程中,并且在运行过程中的临时变量都是在自己的进程中申请的。

3. DLL 的优点:(1)共享资源、代码和数据,节省空间 (2)多种语言之间互相调用方法功能的接口 (3)分离易变部分功能,使应用程序易于维护

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值