
全部展开
DLL是Dynamic Link Library的缩写,是动态链接库的意思. DLL文件通常存储在C: WindowsSystem目录中. DLL是一个包含可被多个程序同时使用的代码和数据的库. 在Windows中,许多应用程序都不是完整的可执行文件,它们被分为一些相对独立的动态链接库,即DLL文件,放置在系统中. 当我们执行某个程序时,将调用相应的DLL文件. 一个应用程序可以具有多个DLL文件,并且一个DLL文件也可以由多个应用程序共享. 这样的DLL文件称为共享DLL文件. 例如,在Windows操作系统中,Comdlg32 DLL执行与对话框相关的常用功能. 因此,每个程序都可以使用DLL中包含的功能来实现“打开”对话框. 这有助于促进代码重用和内存的有效利用.
通过使用DLL,可以将程序模块化,并由相对独立的组件组成. 例如,会计程序可以按模块出售. 每个模块都可以在运行时加载到主程序中(如果已安装相应的模块). 由于模块彼此独立,因此程序加载速度更快,并且仅在请求相应功能时才加载模块.
此外,在不影响程序其他部分的情况下,更容易将更新应用于单个模块. 例如,您可能有一个薪资计算程序,并且税率每年都会变化. 将这些更改隔离到DLL中后,您可以应用更新,而无需重建或安装整个程序.
在Windows操作系统中以DLL形式实现的某些文件:
·ActiveX控件(.ocx)文件
ActiveX控件的一个示例是日历控件,它使您可以从日历中选择一个日期.
·控制面板(.cpl)文件
一个例子
.cpl文件是位于控制面板中的项目. 每个项目都是专用的DLL.
·设备驱动程序(.drv)文件

设备驱动程序的一个示例是控制打印到打印机的打印机驱动程序.
DLL的优点
程序使用DLL时提供了一些优点:
·使用更少的资源
当多个程序使用相同的函数库时,DLL可以减少磁盘和物理内存上加载的代码的重复次数. 这不仅会严重影响前台运行的程序,还会影响Windows操作系统上运行的其他程序.
·促进模块化体系结构
DLL帮助促进模块化程序的开发. 这可以帮助您开发需要多种语言版本的大型程序或需要模块化体系结构的程序. 模块化程序的一个示例是具有多个模块的记帐程序,这些模块可以在运行时动态加载.
·简化部署和安装
当需要更新或修复DLL中的功能时,部署和安装DLL不需要重新建立程序与DLL之间的链接. 此外,如果多个程序使用同一个DLL,则多个程序将从更新或修复中受益. 当您使用定期更新或修复的第三方DLL时,可能会更频繁地出现此问题.
1. 如何了解应用程序使用了哪些DLL文件
右键单击该应用程序,然后在快捷菜单中选择“快速查看”命令. 在出现的“快速查看”窗口的“简介表”列中,您将看到它对DLL文件的使用.

2. 如何知道该DLL文件已被多个程序使用
运行Regedit并输入HKEY_LOCAL_MACHINESoftwareMicrosrftWindowsCurrent-
ersionSharedDlls子项视图,右侧窗口显示所有DLL文件和相关数据,其中数据右侧括号中的数字表示该文件已被多个程序使用怎么写dll文件,(2)表示该文件已被两个程序使用程序(0)表示没有要使用的程序,您可以将其删除.
3. 如何解决DLL文件丢失的问题
有时,当您卸载文件时,将提醒您删除DLL文件可能会影响其他应用程序的操作. 因此,当您卸载软件时,可能会意外删除共享的DLL文件. 缺少DLL文件后,如果可以确定其名称,则可以在Sysbckup(系统备份文件夹)中找到该DLL文件并将其复制到System文件夹中. 如果这不起作用,则在计算机启动时将始终出现“ *** dll文件丢失...”的提示框. 您可以在“开始/运行”中运行Msconfig以进入“系统配置实用程序”对话框,然后单击以选择“ System.ini”选项卡,找到丢失的DLL文件,使其未被选中,从而不会出现错误提示引导时.
rundll的功能是通过命令行调用Windows的动态链接库.
Rundll32.exe和Rundll.exe之间的区别在于,前者是32位链接库,而后者e799bee5baa6e59b9ee7ad9431333332643235是16位链接库. rundll32.exe是专门用于调用dll文件的程序.
如果使用的是Win98,则Windows目录中通常存在rundll32.exe;
如果使用WinXP,则WindowsSystem32目录中通常存在rundll32.exe.
如果它在另一个目录中,则可能是木马程序,它将伪装成rundll32.exe.
DLL故障排除工具

您可以使用多种工具来帮助您解决DLL问题. 以下是其中一些工具.
Dependency Walker
Dependency Walker工具可以进行递归扫描,以查找程序使用的所有依赖DLL. 当您在Dependency Walker中打开程序时,Dependency Walker会执行以下检查:
·Dependency Walker检查DLL是否丢失.
·Dependency Walker检查是否存在无效的程序文件或DLL.
·Dependency Walker检查导入的功能和导出的功能是否匹配.
·Dependency Walker检查是否存在循环依赖错误.
·Dependency Walker检查是否存在由于操作系统不同而无效的模块.
通过使用Dependency Walker,您可以记录该程序使用的所有DLL. 这可能有助于避免和纠正将来可能发生的DLL问题. 当您安装Microsoft Visual Studio 6.0时,Dependency Walker将位于以下目录中:
驱动器\程序文件\ Microsoft Visual Studio \通用\工具
DLL通用问题解决器

DLL通用问题解决器(DUPS)工具用于审核,比较,记录和显示DLL信息. 下表描述了组成DUPS工具的实用程序:
Dlister.exe: 该实用工具枚举计算机中的所有DLL,并将此信息记录在文本文件或文件中.
·Dcomp.exe: 该实用程序将比较两个文本文件中列出的DLL,并生成包含差异的第三个文本文件.
·Dtxt2DB.exe: 该实用程序将使用Dlister.exe实用程序和Dcomp.exe实用程序创建的文本文件加载到dllHell中.
·DlgDtxt2DB.exe: 该实用工具提供了Dtxt2DB.exe实用工具的图形用户界面(GUI)版本.
DLL类型
在应用程序中加载DLL时,可以使用两种链接方法来调用导出的DLL函数. 两种链接方法是加载时的动态链接和运行时的动态链接.
1,加载时动态链接
在加载时进行动态链接时,应用程序对导出的DLL函数(例如本地函数)进行显式调用. 要在加载时使用动态链接,请在编译和链接应用程序时提供头文件(.h)和导入库文件(.lib). 当您执行此操作时,链接程序将为系统提供加载DLL并在加载时解析导出的DLL函数的位置所需的信息.
2. 运行时动态链接
在运行时动态链接中,应用程序调用LoadLibrary函数或LoadLibraryEx函数以在运行时加载DLL. 成功加载DLL后,可以使用GetProcAddress函数获取要调用的导出DLL函数的地址. 使用运行时动态链接时,无需使用导入库文件.
Win32 DLL的特征
Win32 DLL与Win16 DLL有很大不同,这主要是由操作系统的设计思想决定的. 一方面,在Win16 DLL中,程序入口点功能和出口点功能(LibMain和WEP)分别实现;在Win32 DLL中,它是由相同的函数DLLMain实现的. 每当进程或线程加载和卸载DLL时,都应调用此函数,其原型为
BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved);
其中,第一个参数代表DLL的实例句柄;第三参数由系统保留;这里我们主要介绍第二个参数,它有四个可能的值: DLL_PROCESS_ATTACH(进程加载),DLL_THREAD_ATTACH(线程加载入),DLL_THREAD_DETACH(线程卸载),DLL_PROCESS_DETACH(进程卸载),可以区分传入的此参数的值DLLMain函数,并根据不同的参数值对DLL进行必要的初始化或清除. 例如,当进程加载DLL时怎么写dll文件,系统分配给DLL的第二个参数是DLL_PROCESS_ATTACH. 此时,您可以基于此参数初始化特定数据. 另一方面,在Win16环境中,所有应用程序都在相同的地址空间中. 在Win32环境中,所有应用程序都有自己的私有空间,并且每个进程的空间彼此独立,这减少了应用程序数量的相互影响,但同时也增加了编程的难度. 如您所知,在Win16环境中,DLL的全局数据对于每个加载它的进程都是相同的. 在Win32环境中,情况已经改变. 当进程正在加载DLL时,系统会自动将DLL地址映射到进程的私有空间,并且DLL的全局数据的副本也将复制到进程空间,这意味着全局值每个进程拥有的相同DLL的数据不一定相同. 的. 因此,如果要在Win32环境下在多个进程中共享数据,则必须进行必要的设置. 也就是说,需要共享的数据被分离并放置在一个独立的数据段中,并且该段的属性被设置为共享.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-205965-1.html
正确