在 Windows
系统中,动态库版本冲突实在是一个老大难的问题了,为了解决这个问题,除了使用大量现有的工具外,你还可以利用丰富的
Windows APIs
函数构造自己的调试工具和实用程序。作为例子,本文将提供三个这种类型的工具,讨论如何利用它们来解决动态库的冲突问题。这三个工具分别是:
DllSpy ——列出加载到系统中的所有 Dlls 以及所有使用这些
Dlls 的进程;
ProcessSpy
——列出系统中所有正在运行的进程以及它们正在使用的 Dlls ;
ProcessXP ——显示
Windows XP 所有并发运行的会话( Sessions )清单;
从所周知,动态库“地狱”( DLL Hell )已经不是什么新鲜玩意儿了,如果你使用第三方的 Dlls
,肯定会碰到不少与它有关的问题,如找不到入口点,或者库版本不兼容等。 .NET 中允许 组件
的并行执行,减少了产生这种问题的几率,但是如果你还没有升级到 .NET
环境,那怎么办?针对这种情况,可用的方法是用不同的工具跟踪 DLL
的依赖性。但是用标准工具跟踪时,你可能最后得不到所要的信息。许多工具都没有你需要的功能,比如自动写日志文件,跟踪分析,仅在控制台操作脚本控制等。
本文我们先用一些现有的工具来考察系统中的运行进程,然后系统地研究本文提供的三个工具: DllSpy ,
ProcessSpy 和 ProcessXP ,以便在今后的开发或调试中使用这些工具和技术。
现有的工具
Depends.exe 是 Visual C++
自带的一个工具。它可能是我们经常使用的工具中最简单的一个工具了,其功能是列出某个应用程序或 DLL 需要的
DLLs 。这个程序在本站可以 下载
(更新版本请到下面这个地址下载: http://www.dependencywalker.com )。如果你需要看某个
DLL 或可执行文件的全路经,可以用它的上下文菜单进行设置:如图一:

图一 察看全路经
对于静态加载的情况(即应用程序在链接过程中将
dlls 对应的 lib
文件链接到程序中),这个工具非常好用,但对于版本较新的系统,大多使用 COM 编程接口,或者说是用
COM 对象编程模型,而 COM 对象的实例化都是运行时加载或者说动态加载某个
DLL 文件,然后通过 LoadLibrary 和
GetProcAddress 调用其中某个特殊的函数来实现的。你不知道这个 DLL
是何时、从哪里被加载的。
一种确定 DLLs 被动态加载的方法是找出需要被每一个进程加载的
DLL 。 Sysinternal 公司( http://www.sysinternals.com
)提供了一个工具软件 ListDlls.exe 。它是一个控制台程序,其图形用户界面( GUI )版本为
Process Explorer 。如图二:

图二 Process Explorer 运行画面
上一篇:Windows2000
DNS服务器的区域类型
下一篇:摆脱DLL地狱困扰之目前的困境(2)
【本站声明】本站刊载的部分内容全部来源互联网,对于此类文章本站仅提供交流平台,不为其版权负责。如涉及侵犯您的知识产权的文章,请联系我们,我们将尽快做出更正。并向您表示感谢!同时特别感谢对本站所有支持的网友。