电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

Windows系统的活动大陆:细看DLL文件


发布日期:2023/3/5 10:42:15
 

在Windows世界中有无数块活动的大陆它们都有一个共同的名字——动态链接库现在就走进这些神奇的活动大陆找出它们隐藏已久的秘密吧!

初窥门径Windows的基石

随便打开一个系统目录一眼望去就能看到很多扩展名DLL的文件这些就是经常说的动态链接库DLL是Dynamic Link Library(即动态链接库)的缩写从Microsoft公司推出首个版本的Windows以来动态链接库就一直是这个操作系统的基础

看看DLL里有什么

与其用晦涩的专业术语来解决DLL是什么不如先来看看DLL里有什么DLL和EXE文件一样其中包含的也是程序的二进制执行代码和程序所需的资源(比如图标对话框字符串等)可是为什么要把代码放在DLL里面而不是做成EXE呢?其实DLL中的代码是以API函数形式出现的通俗地说DLL中包含的程序代码都被做成了一个个小模块应用程序通过按下所需DLL中特定的按钮来调用DLL中这个按钮所代表的功能在使用记事本等程序时如果要保存文件或打开文件就会弹出通用文件对话框选择文件位置你可知道这就是调用了系统底层DLL中的通用对话框界面

系统中几个重要的DLL

Windows中有个非常重要的底层DLL:KerneldllUserdllGDIdll其中Kerneldll顾名思义就是内核相关的功能主要包含用于管理内存进程和线程的函数;而Userdll中包含的则是用于执行用户界面任务的函数比如把用户的鼠标点击操作传递给窗口以便窗口根据用户的点击来执行预定的事件;GDIdll的名称用了缩写全称是Graphical Device Interface(图形设备接口)包含用于画图和显示文本的函数比如要显示一个程序窗口就调用了其中的函数来画这个窗口

为什么要用DLL

刚才在谈到这个问题的时候只解释了DLL将程序代码封装成函数的原理为什么封装成函数就能成为系统中大量使用DLL的理由呢?

①扩展应用程序

由于DLL能被应用程序动态载入内存所以应用程序可以在需要时才将DLL载入到内存中这让程序的可维护性变得很高比如QQ的视频功能需要升级那么负责编写QQ的程序员不必将QQ所有代码都重写只需将视频功能相关的DLL文件重写即可

②便于程序员合作

这个和最终用户关系不大仅供了解大家都知道编程工具有很多比如VBVCDelphi等如果好几个人合作来编写一个大的程序那么可能有的人用VB有的人用VC每人负责的部分所使用的编程语言都不同究竟放在哪个编译器中进行编译呢?这就好比一群来自各个国家的人在共同编写一篇文章如果他们所使用的语言都不同写出来的文章怎么可能凑到一起呢?而有了DLL后可以让VC程序员写一个DLL然后VB程序员在程序中调用无需为怎么将它们都编译为一个单独的EXE而发愁了

③节省内存

如果多个应用程序调用的是同一个动态链接库那么这个DLL文件不会被重复多次装入内存中而是由这些应用程序共享同一个已载入内存的DLL就好比一个办公室中很少会为每一个员工配置一台饮水机的而是在一个公共位置放上一个饮水机所有需要喝水的职员都可以共用这台饮水机降低了成本又节约了空间

④共享程序资源

包括刚才提到过的通用文件对话框在内DLL文件提供了应用程序间共享资源的可能资源可以是程序对话框字符串图标或者声音文件等

⑤解决应用程序本地化问题

在下载了某个程序的汉化包后打开汉化说明经常可以看到用下载包中的DLL文件覆盖掉程序原来的DLL汉化就完成了这些程序都是将执行代码和应用程序界面分开编写了所以汉化者只需简单地将其中和程序界面相关的DLL汉化并发布即可

求知若渴:探究DLL的真相

谁知道DLL里究竟有多少函数又有谁知道EXE调用了哪个DLL的哪些函数?其实这个问题并不难解决分析EXE文件的工具Dependency Walker(以下简称Depends)今天它就是大家探险的工具把DLL真相探个通通透透

看看DLL里有多少函数

第一步:下载并解压Depends运行其中的dependsexe然后选择菜单File→Open(文件→打开)在文件选择框中选中需要分析的DLL文件并打开此处选择QQ目录下的QQZipdll

第二步:在程序左侧的树状栏中就列出了这个DLL使用了哪些其他DLL的功能函数(原来DLL中还可以调用其他DLL^O^)而右侧的两个分栏列表分别显示了函数输入及输出表函数输出表即为该DLL提供给其他EXE或者DLL调用的函数的总列表

第三步:函数输出表的Function栏中即为输出函数的名称(见图在QQZipdll中共发现了个函数:UnzipZip因此可以判断该DLL在QQ程序中负责压缩和解压缩的任务

QQZipdll中的函数

审审EXE究竟用了哪个DLL

还是拿QQ来作为例子在Depends中打开QQexe这时界面左侧的树状列表中显示的就是QQexe调用的DLL列表(见图如果展开这些DLL分支还会发现其他的DLL这就说明QQ调用的这些DLL文件还有可能(几乎是肯定)再调用别的DLL这就好比买了一台新的DVD机可能其中用的机芯是SONY的而这个机芯里的一个小电容又有可能是别的公司的这是同样的道理

QQexe所调用的dll

用DLL看穿EXE真面目

刚才得到了QQexe所使用的DLL列表其实通过这个列表还能分析出很多别的信息比如其中包含MFCdll所以可以判断QQexe是采用VC(即Visual C++)编写的而包含WSOCKdll则说明这个程序带有网络通讯功能(废话!QQ如果不能网络通讯还有什么用……)以下是一个简表大家在分析别的EXE时可以根据其所使用的DLL来对其功能进行初步判断

DLL文件名 可以判断出的EXE信息

MFCdll 使用VC/编写

VBRun*dll *代表数字版本号使用VB/编写

MSVBVMdll 使用VB编写在Windows (SE)上自带该DLL

MSVBVMdll 使用VB编写在Windows Me//XP等系统上自带该DLL

ADVAPIdll 可能会进行注册表操作

WSOCKdll 具备网络通讯功能

WS_dll 具备网络通讯功能

WININETdll 具备HTTP浏览下载等功能典型的例子是浏览器下载工具

WINMMdll 具备多媒体播放能力

DDRAWdll 游戏高级图像处理工具

DD*dll D游戏或者动画处理工具

DLL是个大宝库

除供应用程序调用函数的DLL外还有另一种用来保存资源的DLL比如QQ目录下的QQResdll用Depends打开后发现没有任何输出函数难道是一个鸡肋DLL?可是改用资源工具Resource Hacker(下载地址:)打开这个DLL后就发现原来其中保存了这么多QQ的资源包括图标音乐图片字符串对话框……(见图

dll文件中包含的其他资源

刨根问底:DLL的寓言

DLL引起的故障是很常见的为什么会引起故障?遇到故障怎么解决?嘘~偷听一下DLL的对话你就会明白了

从搬运工谈接口兼容性

在Windows工地上有一个名叫EXE的包工头他手下有很多称为DLL的建筑工人其中有一个专门负责搬运的DLL(暂且称为搬运工A)每次需要搬运水泥时包工头EXE都只要对他喊一声:来!搬

过了一段时间搬运工A觉得自己的效率太低于是从原来的每次搬袋水泥改成了每次搬袋水泥改进了搬运方法后EXE包工头仍然每次只是喊一声:来!搬却不知搬运工A已经改变了搬运的方法

但又过了一段时间包工头EXE把搬运工A给辞退了从别的工地上找来了另一个DLL(暂且称为搬运工B)这个搬运工在别的工地的时候搬运东西特别快所以包工头EXE决定把搬运工作给升级一下但真正开始工作时包工头才发现出了问题……现在不管叫几遍来!搬这个新来的搬运工B都不知道究竟应该搬什么

上面的例子中搬运工A改进搬运方法但EXE调用它的方法仍不变这就是DLL升级的原理改进了内部的实现方法但调用接口不变这样EXE文件不用跟着升级就能调用新版本的DLL了而搬运工B的故事说明不管新版本的DLL效率多高如果接口(可以理解为DLL中输出的函数名)与原来的不一致那么EXE就不知道也无法调用它了

登记身份证的DLL

在系统故障中有很多都是由于DLL文件没有注册造成的比如Windows XP的压缩文件夹功能出现故障就很有可能是系统目录中的zipfldrdll没有注册造成的这类故障的解决方法也大多是运行如下命令:

regsvr DLL文件名

很多人不理解为什么要这么做是不是所有的DLL都能这样做呢?

其实系统中有两种DLL一种是不需注册即可使用的另一种则是必须经过系统登录(即注册)才能使用的就好像一个临时工和一个记录在员工名单上的长期合同工的区别一样如何才能区分这两种DLL呢?方法很简单用刚才的Depends打开这个DLL同样是看函数输出表如果其中包含以下两个函数(前者是注册DLL后者是反注册DLL)那么就一定是需要注册才能使用的DLL了

DllRegisterServer

DllUnregisterServer

而regsvr这个命令实际上就是调用DLL中的这两个函数(regsvr /u DLL文件名调用的即为DllUnregisterServer反注册函数)

插件DLL的秘密

WinampFoobar 等很多软件都具有插件功能从网上下载一个DLL放在插件目录下就能让程序支持新的功能这是怎么做到的呢?就拿时下流行的播放软件千千静听来举例吧

千千静听的插件目录在该软件安装目录下的Addin子目录下程序的插件目录一般都会以PluginsAddin来命名千千静听的插件目录中有许多DLL文件比如tt_asfdlltt_rmdll等从文件名中就能看出这些DLL是用来让这个播放器支持各种不同类型的音频文件的同样用Depends打开这些文件你就会发现这些文件的输出函数表中都包括一个同样的函数:ttpGetSoundAddIn(见图

千千静听所使用的插件协议

这就是插件的秘密各种支持插件功能的程序在发布时都会同时发布一份插件协议协议中规定了该程序将要调用的插件DLL中必须包含的函数名称及相关的参数规则然后第三方的插件程序员在编写这个程序的插件时就根据这个插件的标准来编写DLL的输出函数

①对于插件tt_asfdll

ttplayerexe(千千静听主程序)对tt_asfdll说:我要调用你的ttpGetSoundAddIn函数!

tt_asfdll回答:OK

②如果把不相关的DLL放进AddIn目录

ttplayerexe对未知DLL说:我要调用你的ttpGetSoundAddIn函数!

tt_asfdll回答:那是什么函数?从来没听说过!

上一篇:微软最新系统 Windows Vista硬件优势揭秘

下一篇:谷歌Chrome3针对WindowsXP进行优化