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"]![静态链接](http://blog.fishc.com/wp-content/uploads/2012/08/图片16.gif)
动态链接
可见,使用静态链接每调用一个函数均会在可执行文件的目标代码中出现一个该函数代码拷贝。 当多个应用程序调用相同的函数时,将会出现一个函数的多个拷贝,其缺陷是很明显的。 动态链接是指在把应用程序的目标代码链接成EXE文件时,没有将函数库中的函数拷贝到应用程序的可执行文件中,而是在程序运行时动态地加载所需的函数。 采用动态链接方式的库文件就是动态链接库(DLL)。 尽管链接器并不把动态链接的函数拷贝到可执行文件中,但是它仍然要清楚这些函数在什么地方以及怎样调用它们,为此需要引入库(Import Library)来帮助链接器使用DLL,引入库中包含了DLL中函数的重定位信息。 当应用程序使用了某个DLL中的一个函数时,链接器并不拷贝代码,而是从引入库中拷贝重定位信息,这些信息指示了运行期间在DLL的什么位置寻找所需的函数代码。 在应用程序执行期间,这些重定位信息创建了一个正在执行的应用程序和在内存中的DLL之间的动态链接。 No picture you say a j8 [caption id="attachment_676" align="aligncenter" width="546"]![动态链接](http://blog.fishc.com/wp-content/uploads/2012/08/图片22.gif)