DLL技术应用01
让编程改变世界
Change the world by program
DLL技术应用
动态连接库(Dynamic Link Library,DLL)是实现Windows应用程序代码重用和共享的重要手段。
它是从C语言函数库和Pascal语言的库单元的概念发展起来的。
在C和Pascal语言中,很多标准函数可以放在一个函数库中或一个库单元中,在用户程序中可以调用这些库单元或函数库中的函数。
在程序编译的时候,由编译器把所调用的函数添加到可执行文件中去(即每个调用均会产生一个函数代码的拷贝)。
但是随着时代的发展,改革开放的到来,使用函数库或库单元等方法已不能适用Windows多任务环境下应用程序。
因为使用这种方法每个应用程序都必须拥有完成屏幕输出、消息处理、内存管理、对话框操作都相同功能的函数,从而使应用程序非常庞大。
为解决这个问题,必须能使几个应用程序能共享函数的单一拷贝,DLL也就应运而生了。接下来小甲鱼将给大家好好介绍一下这门有用的技术。
DLL的概念
DLL是一个可以执行的并可以被多个Windows应用程序共享的程序模块(Module),模块中包含了一些可以被多个Windows应用程序或DLL共享的代码、数据和资源。
动态链接库不用重复编译或链接,一旦装入内存,DLL中的函数就可以被系统中的任何正在运行的应用程序所使用,而不必产生函数的多个拷贝。
DLL主要的用途是使应用程序可以在运行时刻载入其中的代码,而不是编译时连接到应用程序中。
DLL文件的扩展名一般是dll,也可能是drv(设备驱动文件),sys(系统文件)和fon(字体资源文件)。
它和可执行文件(exe)很类似,区别在于,DLL文件中虽然包含了可执行代码却不能单独执行,只能由Windows应用程序直接或间接调用。
DLL类似于一般的运行函数库,但它与一般的运行库函数又有区别,区别主要在于,DLL与一般的函数库与应用程序链接的时机不同。
DLL是在应用程序运行期间被链接进来的,而一般函数库是在应用程序使用链接器(Linker)链接文件时被链接进来的。
这两种链接方式分别称为动态链接与静态链接。
下面小甲鱼给大家介绍这两种链接方式的概念。
静态链接
传统的库函数是通过静态链接链接到应用程序中的。这些库函数可能来自程序设计语言提供的标准库,也可能是由操作系统提供的API。
由应用程序源文件产生可执行文件,一般要经历两个过程:
一是将源程序编译成目标模块,在此阶段中,凡调用到库函数的地方都被标识为外部对象的引用;
二是把目标模块链接成EXE文件,该阶段将所有要用到的函数均拷贝一份,插入到应用程序的目标模块文件中,从而生成可执行文件。
也就是说静态链接是将应用程序调用的库函数拷贝一份嵌入到应用程序的可执行文件中去。
No picture you say a j8!
[caption id="attachment_675" align="aligncenter" width="528"]
静态链接[/caption]
动态链接
可见,使用静态链接每调用一个函数均会在可执行文件的目标代码中出现一个该函数代码拷贝。
当多个应用程序调用相同的函数时,将会出现一个函数的多个拷贝,其缺陷是很明显的。
动态链接是指在把应用程序的目标代码链接成EXE文件时,没有将函数库中的函数拷贝到应用程序的可执行文件中,而是在程序运行时动态地加载所需的函数。
采用动态链接方式的库文件就是动态链接库(DLL)。
尽管链接器并不把动态链接的函数拷贝到可执行文件中,但是它仍然要清楚这些函数在什么地方以及怎样调用它们,为此需要引入库(Import Library)来帮助链接器使用DLL,引入库中包含了DLL中函数的重定位信息。
当应用程序使用了某个DLL中的一个函数时,链接器并不拷贝代码,而是从引入库中拷贝重定位信息,这些信息指示了运行期间在DLL的什么位置寻找所需的函数代码。
在应用程序执行期间,这些重定位信息创建了一个正在执行的应用程序和在内存中的DLL之间的动态链接。
No picture you say a j8
[caption id="attachment_676" align="aligncenter" width="546"]
动态链接[/caption]
可见,在动态链接时,应用程序和所需的DLL均应加载进入内存。
根据应用程序中的重定位信息找到DLL中相应的函数,从而可以执行该函数功能以完成函数的调用。
当多个应用程序调用同一个DLL文件中的同一个函数时,不会生成该函数的多个拷贝,DLL文件也只在内存中存在一份。
因此使用DLL不但便于应用程序之间共享代码,而且有利于节省内存。
小甲鱼给大家总结一下DLL的优点促进大家消化。
使用DLL的优点
第一,应用范围广
DLL中不仅可以包含可执行代码,还可以包括数据和各种资源等,这扩大了库文件的使用范围。
有些设备驱动程序也是由动态链接库实现的(扩展名一般是drv)。
第二,便于开发大型软件
一个大型系统,如果用一个可执行文件完成,程序将很庞大且冗杂。
如果将程序分成一系列的主程序和DLL,可以减少开发的工作量。并且,由于每个模块减小了,访问的速度也提高了。
第三,便于对系统进行升级
将一些功能模块做成DLL后,如果需要对系统进行升级,只要将个别DLL进行升级,然后用新的DLL文件覆盖掉旧的DLL文件就可以了,而不需要将整个系统进行重新编译和链接。
第四,隐藏细节
例如,有一件工作的完成方法有许多,可以将这些方法利用DLL实现,当以后新增加了方法后,将新方法也用DLL实现,然后只要对原来的工程文件做少量的修改就可以了。
这样,就隐藏了DLL的实现细节,减少了使用该DLL的客户程序的实现复杂性,从而增加了重用的可能性。
第五,独立于程序设计语言
DLL是符合一定标准的使用不同语言进行编写的函数库。
例如:在Delphi 环境中开发的DLL 库可以在Visual C++环境中方便地使用,同时,在Delphi环境中也可以方便地使用在Visual C++中开发的DLL。
好了,总结到此结束!
大家是不是觉得这个必须学呢?那么下节课大家应该不会逃课吧?
[buy]
获得所有教学视频、课件、源代码等资源打包 [/buy]
[Downlink href='http://kuai.xunlei.com/d/LZDQXRSJQYXK']视频下载[/Downlink]