LoadLibraryExW()失败,最后一个错误是ERROR_MOD_NOT_FOUND,但没有丢失依赖项?

时间:2013-05-22 20:14:43

标签: winapi loadlibrary dependency-walker

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

所以我们自然而然地想,使用Dependency Walker来查找特定机器上缺少的依赖项。不幸的是,它没有显示任何遗漏,只是一些延迟加载警告,不是库的直接依赖。根据我的使用经验,depends.exe始终显示缺少的依赖项。

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

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

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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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

gflags.exe -i yourcode.exe +sls
windbg yourcode.exe

答案 2 :(得分:0)

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