DLL是Dynamic Link Library的缩写,意为动态链接库。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可有多个DLL文件,一个DLL文件也可能被几个应用程序所共用,这样的DLL文件被称为共享DLL文件。DLL文件一般被存放在C:/Windows/System目录下。
动态链接库是一个包含了若干个导出函数的可执行模块,与静态链接库(如C语言的运行函数库)类似,它其实是一个函数包。动态链接库与静态链接库的主要区别是库代码的链接时机,动态链接库是在被应用程序调用时才同程序相链接,而静态链接库则是在应用程序进行编译/链接时就同程序相链接。前者称为动态链接,链接操作由Windows操作系统来完成。后者被称为静态链接,链接操作由链接器LINK来完成。静态链接库把函数代码直接加入到应用程序中,增加了应用程序最终可执行代码的长度。静态链接库在多任务环境中运行时效率很低,如果两个应用程序同时运行,且使用了库中的同一函数,那么要求系统提供函数的两个副本,降低了内存的效率。与静态链接库不同,动态链接库则允许若干个应用程序共享某个函数的单个副本,即库中的一个函数不管被几个程序调用,在内存中只运行一个副本。动态链接库中函数的地址转换是在加载时完成的。
使用动态连接库的一些好处是:
1.多个应用程序共享代码和数据:比如Office软件的各个组成部分有相似的外观和功能,这就是通过共享动态连接库实现的。
2.在钩子程序过滤系统消息时必须使用动态连接库。
3.动态连接库以一种自然的方式将一个大的应用程序划分为几个小的模块,有利于小组内部成员的分工与合作。而且,各个模块可以独立升级。如果小组中的一个成员开发了一组实用例程,他就可以把这些例程放在一个动态连接库中,让小组的其他成员使用。
4.为了实现应用程序的国际化,往往需要使用动态连接库。使用动态连接库可以将针对某一国家、语言的信息存放在其中。对于不同的版本,使用不同的动态连接库。在使用AppWizard生成应用程序时,我们可以指定资源文件使用的语言,这就是通过提供不同的动态连接库实现的。
VC++、C++ Builder、Delphi都可以编写DLL文件。Visual Basic 5.0以上版本也可以编写一种特殊的DLL,即ActiveX DLL。在Visual Basic中建立一个.dll文件实际上是一个ActiveX对象。这种对象可以采用微软的组件对象模型(COM)技术来实现,你也可以使用它们来建立与.dll相关的类。VB中做不了标准的DLL,也就是在VB中必须使用Declare语句声明后才能使用的DLL,那种VB做不了。VB只能做两种特殊的DLL,一个是ActiveX DLL(*.dll)和ActiveX Control(*.ocx)。这两种DLL都是VB支持的标准类型。
动态链接库的性质:
1、 DLL不是独立运行的程序,它是某个程序的一个部分,它只能由所属的程序调用。用户不能,也不需要打开它。比如msvbvm60.dll并不是一个独立的程序,它是Visual Basic 6.0运行库的一个文件,所有使用Visual Basic 6.0编写的程序都需要这个库文件才能运行。如果哪个软件因为缺少这个文件无法运行。
2、如果你希望在什么说明文件都没有的情况下调用DLL的函数,那么你不会成功,因为DLL中只包括函数的名字,不包括函数的参数和调用方法这样的信息。使用VC的dumpbin(在Bin目录中)或Delphi的TDump,你可以得到DLL中包括哪些函数,但这些函数是什么意义、怎么调用是无法知道的。在资源管理器里右击鼠标,选快速查看(QuickView)也能看到dll的导出函数。遗憾的是也没办法看到用法(注:Windows默认是不安装QuickView的,如果想安装需要从控制面板选择“添加/删除程序”添加QuickView)。用TDump.exe(Delphi5里或C++Builder6有)可以将该dll的信息导出到其他文件中。
用法:
tdump my.dll a.txt
or
tdump my.dll > a.txt
然后可以查看a.txt文件
2、 查看一个动态库中有哪些函数,一个办法是利用命令行工具Dumpbin(在Bin目录中),当使用/EXPORTS参数,你可以看到DLL中有哪些函数。另一个办法是使用VC++ 6.0以上版本的工具Dependency Walker,这个工具很容易使用,也可以看到其中有哪些函数可用。但是不管哪个工具都只能知道有哪些函数,而不能知道如何调用这些函数。这个工具也可以从http://www.DependencyWalker.com下载。
使用动态链接库中存在的问题:
1、如何了解某应用程序使用哪些DLL文件
右键单击该应用程序并选择快捷菜单中的“快速查看”命令,在随后出现的“快速查看”窗口的“引入表”一栏中你将看到其使用DLL文件的情况。
2、如何知道DLL文件被几个程序使用
运行Regedit,进入 HKEY_LOCAL_MACHINE/Software/Microsrft/Windows/Current- Version/SharedDlls子键查看,其右边窗口中就显示了所有DLL文件及其相关数据,其中数据右边小括号内的数字就说明了被几个程序使用,(2)表示被两个程序使用,(0)则表示无程序使用,可以将其删除。
3、如何解决DLL文件丢失的情况
有时在卸载文件时会提醒你删除某个 DLL 文件可能会影响其他应用程序的运行。所以当你卸载软件时,就有可能误删共享的 DLL 文件。一旦出现了丢失 DLL 文件的情况,如果你能确定其名称,可以在 Sysbckup (系统备份文件夹)中找到该 DLL 文件,将其复制到 System 文件夹中。如果这样不行,在电脑启动时又总是出现“ ***dll 文件丢失……”的提示框,你可以在“开始 / 运行”中运行 Msconfig ,进入系统配置实用程序对话框以后,单击选择“ System.ini ”标签,找出提示丢失的 DLL 文件,使其不被选中,这样开机时就不会出现错误提示了。