还是拿QQ来作为例子,在Depends中打开QQ.exe,这时界面左侧的树状列表中显示的就是QQ.exe调用的DLL列表(见图2),如果展开这些DLL分支,还会发现其他的DLL,这就说明QQ调用的这些DLL文件还有可能(几乎是肯定)再调用别的DLL。这就好比买了一台新的DVD机,可能其中用的机芯是SONY的,而这个机芯里的一个小电容又有可能是别的公司的,这是同样的道理。
3.用DLL看穿EXE真面目
刚才得到了QQ.exe所使用的DLL列表,其实通过这个列表,还能分析出很多别的信息。比如其中包含MFC42.dll,所以可以判断QQ.exe是采用VC(即Visual C++)编写的,而包含WSOCK32.dll则说明这个程序带有网络通讯功能(废话!QQ如果不能网络通讯还有什么用……)。以下是一个简表,大家在分析别的EXE时可以根据其所使用的DLL来对其功能进行初步判断。
DLL文件名 可以判断出的EXE信息
- MFC42.dll 使用VC5.0/6.0编写。
- VBRun*.dll “*”代表数字版本号,使用VB3.0/4.0编写。
- MSVBVM50.dll 使用VB5.0编写,在Windows 98(SE)上自带该DLL。
- MSVBVM60.dll 使用VB6.0编写,在Windows Me/2000/XP等系统上自带该DLL。
- ADVAPI32.dll 可能会进行注册表操作。
- WSOCK32.dll 具备网络通讯功能。
- WS2_32.dll 具备网络通讯功能。
- WININET.dll 具备HTTP浏览、下载等功能,典型的例子是浏览器、下载工具。
- WINMM.dll 具备多媒体播放能力。
- DDRAW.dll 游戏、高级图像处理工具。
- D3D*.dll 3D游戏,或者动画处理工具。
- 4.DLL是个大宝库
除供应用程序调用函数的DLL外,还有另一种用来保存资源的DLL,比如QQ目录下的QQRes.dll,用Depends打开后发现没有任何输出函数,难道是一个鸡肋DLL?可是改用资源工具Resource Hacker(下载地址:http://www.onlinedown.net/soft/12420.htm)打开这个DLL后,就发现原来其中保存了这么多QQ的资源,包括图标、音乐、图片、字符串、对话框……(见图3)
图3 dll文件中包含的其他资源
刨根问底:DLL的寓言
DLL引起的故障是很常见的,为什么会引起故障?遇到故障怎么解决?嘘~偷听一下DLL的对话,你就会明白了。
1.从搬运工谈接口兼容性
在Windows工地上,有一个名叫EXE的包工头,他手下有很多称为DLL的建筑工人。其中有一个专门负责搬运的DLL(暂且称为“搬运工A”),每次需要搬运水泥时,包工头EXE都只要对他喊一声:“来!搬。”
过了一段时间,搬运工A觉得自己的效率太低,于是从原来的每次搬1袋水泥改成了每次搬3袋水泥。改进了搬运方法后,EXE包工头仍然每次只是喊一声:“来!搬。”却不知搬运工A已经改变了搬运的方法。
但又过了一段时间,包工头EXE把搬运工A给辞退了,从别的工地上找来了另一个DLL(暂且称为“搬运工B”)。这个搬运工在别的工地的时候,搬运东西特别快,所以包工头EXE决定把搬运工作给“升级”一下。但真正开始工作时,包工头才发现出了问题……现在不管叫几遍“来!搬。”这个新来的搬运工B都不知道究竟应该搬什么。