我有一个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”似乎可以正常工作。
答案 0 :(得分:3)
使用来自SysInternals的Process Monitor或FileMon可能会告诉您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更容易使用。