7

客户正在使用我们的 dll,它正在创建一个使用开源库的子进程,最终由于调用 LoadLibraryExW() 而失败,返回的最后一个错误是 ERROR_MOD_NOT_FOUND。这发生在 WinXP 32 位上,但不在其他机器上。但是我们知道安装了正确的依赖集,甚至在同一个目录中。

所以我们很自然地想到,使用 Dependency Walker 来查找特定机器上缺少哪些依赖项。不幸的是,它没有显示任何缺失,只是一些不是库的直接依赖关系的延迟加载警告。在我使用depends.exe 的经验中,总是揭示缺少的依赖项是什么。

所以在这一点上,我已经把头发拉出来试图理解如果所有库的依赖项都存在,为什么我会得到 ERROR_MOD_NOT_FOUND ?使这台机器独一无二的唯一另一件事是它非常安全,因为它被政府使用,但如果我们遇到访问/权限问题,我预计会出现不同类型的错误代码。

我已经构建了一个小的 Win32 可执行文件,除了在所述库上调用 LoadLibraryExW() 之外什么都不做,当它从与库所在的相同目录运行时,它会在客户有问题的机器上毫无问题地加载库。

一件事是我们的产品是一个 ActiveX 插件,它启动一个子进程,子进程调用第 3 方库,第 3 方库调用有问题的 LoadLibraryExW()。所以也许它失败的原因是它正在运行的上下文(例如来自浏览器)?

4

3 回答 3

4

在您的应用程序上使用 Dependency Walker 的Profiling选项。可能该库正在尝试动态解析某些 API(使用 LoadLibrary/GetProcAddress),而这不会显示在静态依赖项中。

于 2013-05-23T11:09:27.547 回答
3

最好的方法是使用加载程序快照。基本上,您使用 gflags.exe(包含在 windbg 中)来启用加载程序快照;然后,在附加了调试器的情况下运行该进程。加载程序快照将使加载程序能够打印出进程的 dbg 消息并打印失败。

gflags.exe -i yourcode.exe +sls
windbg yourcode.exe
于 2019-06-20T00:25:12.093 回答
0

您的依赖项可能存在于系统上,但它们可能位于 LoadLibraryExW() 期间不属于搜索顺序的文件夹中。SetDllDirectory() 或 AddDllDirectory() 调用将确保在 LoadLibraryExW() 调用期间搜索包含依赖项的文件夹

于 2020-05-31T12:38:05.767 回答