LoadLibrary失败:第一次机会异常0xC0000139(找不到DLL) - 如何调试?

时间:2009-04-27 21:37:26

标签: c++ exception dll loadlibrary

我有一个dll“mytest.dll”,当通过LoadLibrary()加载时,返回NULL(和GetLastError()的127)。如果我在“mytest.dll”上使用DependencyWalker,它会报告它应该正确加载并且正确找到所有DLL。在主机exe上运行DependencyWalker的探查器选项,可以在日志中找到相关部分:

00:00:55.099: Loaded "mytest.DLL" at address 0x07860000 by thread 0xBBC.  Successfully hooked module.
00:00:55.115: First chance exception 0xC0000139 (DLL Not Found) occurred in "NTDLL.DLL" at address 0x76E24285 by thread 0xBBC.
00:00:55.115: Unloaded "mytest.DLL" at address 0x07860000 by thread 0xBBC.
00:00:55.115: LoadLibraryW("mytest.dll") returned NULL by thread 0xBBC. Error: The specified procedure could not be found (127).

有没有办法调试这个以找出NTDLL.DLL报告的试图查找的DLL Not Found消息?或者我应该在别处寻找问题的根源?

请注意,从其他应用程序加载相同的“mytest.DLL”似乎可以正常工作。

3 个答案:

答案 0 :(得分:3)

使用来自SysInternals的Process MonitorFileMon可能会告诉您myTest.dll是否根本不在其中的位置。

答案 1 :(得分:3)

在初始加载(可能)之后,您的应用程序是否可能尝试通过GetProcAddress调用特定的DLL函数?它是32位还是64位应用程序?

如果它按照你的建议在另一个应用程序中正确加载,那么它可能有一个正确的入口点。

快速google search表明您返回的错误代码可能来自DLL中缺少的函数名称(或特定函数的序数值)。我建议在Exescope之类的东西中打开DLL并检查导出列表。

它也可以解释为什么DLL可以与另一个应用程序一起工作(也许其他应用程序在DLL中使用不同的导出函数)?

答案 2 :(得分:2)

DependencyWalker显示隐式依赖项(Windows加载程序自动处理的依赖项)。使用LoadLibrary加载的DLL是显式依赖项,而DependencyWalker无法找到它们(例如,可能会从ini文件中读取库名称,并且DependencyWalker无法推断出这一点。)

DLL在一个应用程序中工作而在另一个应用程序中工作并不常见。在最常见的情况下,一个应用程序已经加载了所需的dll而另一个不加载。如果dll不在路径上,那么你的dll将在第一种情况下工作而不在第二种情况下工作。

无论如何,请遵循Michael Burr的建议并使用FileMon。即使SysInternals网站说FileMon已经过时,它仍然比ProcMon更容易使用。