1

我有一个 Java 应用程序,它在运行时使用 System.loadLibrary() 从指定文件夹加载一些 DLL。应用程序成功加载了它在文件夹中找到的所有 DLL,但只有一个 DLL。在加载不成功的情况下,报错:

C:\myapp\lib\foo.dll:找不到依赖库

我已经在 DependencyWalker 中打开了 foo.dll,但它没有报告任何问题(它将 IESHIMS.DLL 和 WER.DLL 列为缺失,但这些是警告,据我所知,这些可以忽略)。依赖关系树列出了 WSOCK32.DLL、KERNEL32.DLL 和另一个包含在 lib 文件夹中(并成功加载)的应用程序特定 DLL。

我最好的猜测是 foo.dll 又依赖于我的 lib 文件夹中不存在的另一个 DLL,但我不知道如何获取有关此依赖项的任何进一步信息。任何人都可以建议一种调试方法吗?

4

2 回答 2

0

AFAIK Dependency Walker 也在库本身所在的文件夹中搜索依赖库。LoadLibrary 不这样做。我的猜测是,当您使用 LoadLibrary 加载依赖项时,您会使用完整路径进行操作,这就是为什么可以找到并加载它,但是当您加载另一个库时却找不到它。

于 2013-07-03T12:08:35.553 回答
0

Dependency Walker具有配置文件模式。使用它来查看哪些模块最终无法加载。您可能会看到一些最终发现的失败,因为通过尝试文件名的各种前缀和后缀来匹配某些模块。

请务必使用与您的可执行文件匹配的 32 位或 64 位版本(例如,javaw.exe)。

要了解 DLL 搜索路径,请参阅 MSDN 上的文档

于 2013-07-03T15:39:25.630 回答