如何以编程方式查找DLL无法加载的原因? 我的C++程序调用 Load RealBug EXEL()/加载第三方DLL。结果是一个空句柄-加载失败。调用GetLastError()之后返回零,这没有多大用处,但至少不是缺少的DLL文件

如何以编程方式查找DLL无法加载的原因? 我的C++程序调用 Load RealBug EXEL()/加载第三方DLL。结果是一个空句柄-加载失败。调用GetLastError()之后返回零,这没有多大用处,但至少不是缺少的DLL文件,c++,winapi,visual-c++,dll,loadlibrary,C++,Winapi,Visual C++,Dll,Loadlibrary,代码是这样的: HINSTANCE instance = ::LoadLibraryExW( path, 0, LOAD_WITH_ALTERED_SEARCH_PATH ); if (instance == 0) { DWORD lastError = GetLastError(); LOG( "Failed to load, error code is " + LastErrorAsString( lastError )); r

代码是这样的:

 HINSTANCE instance = ::LoadLibraryExW(
     path, 0, LOAD_WITH_ALTERED_SEARCH_PATH );
 if (instance == 0)
 {
     DWORD lastError = GetLastError();
     LOG( "Failed to load, error code is " +
         LastErrorAsString( lastError ));
     return E_FAIL;
 }
我无法访问该机器-我只能在那里部署代码并观察上传到网络存储中的日志


如何通过编程找到DLL加载失败的原因?

可能可以找到您的DLL,但它依赖于远程计算机上找不到的DLL

如果无法使用Dependency Walker,则可以尝试使用以下文章中所述的技术:


看起来问题可能是安装了钩子或其他防病毒措施的第三方软件,钩子可能有问题,并且没有设置正确的最后错误代码

作为一种故障排除措施,您应该尝试代替LoadLibraryEx


请注意,这是一个未记录的内部函数,因此您可能不希望在生产代码中使用它,但这将是一个有用的故障排除步骤,因为它会生成一个更有用的错误代码。

好的,所以我进行了更好的检查-确实有另一个WinAPI调用导致在
LoadLibraryEx()之后覆盖“last error”(最后一个错误)
。它隐藏在C++的帮助对象的几层深处,所以我没有注意到它。因此,这是调用方代码中的一个错误,真正的“最后一个错误”不是零。

在检查
NULL
句柄后,是否直接调用
GetLastError
?在这两个函数之间,您没有调用任何其他函数吗?请共享代码,而不是引用您正在使用的函数。“这将帮助我们尝试为您隔离这个问题。”乔纳托诺登补充道snippet@JoachimPileborg是的,这是我检查的第一件事。来自MSDN:如果使用此值并且lpFileName指定了绝对路径,系统使用备注部分中讨论的备用文件搜索策略来查找指定模块导致加载的相关可执行模块。如果使用此值并且lpFileName指定了相对路径,则行为未定义。您确定使用了绝对路径吗?在这种情况下,GetLastError必须返回ERROR_MOD_NOT_FOUND和/或RtlGetLastNtStatus-STATUS_DLL_NOT_FOUND-因此这不是解释请看这不是解释,而是搜索方向。无论如何,我建议您检查LoadLibraryExW为什么返回null,GetLastError为什么返回SUCCESSthis absolute不解释GetLastError为什么返回0在发布建议使用未记录的内部函数的答案时,您应该明确说明这一点。虽然了解内部结构有助于诊断问题,但基于这些实现细节的解决方案通常没有帮助,应该标记为“不受支持”、“随时可能中断”等。“LdrLoadDll[…]是最佳[…]选择”-这取决于您的需求。如果你实施了一个有趣的项目,并且不在乎,如果未来的Windows更新破坏了它,那么继续使用它。如果您编写一些关键任务代码,您肯定不希望使用不受支持的系统调用。做出那个决定不是你的责任。但是,您有责任记录建议的解决方案不受支持,以便读者可以根据这一重要细节做出决定。这并不能提供问题的答案。若要评论或要求作者澄清,请在其帖子下方留下评论。-@Wernsey的问题是“为什么DLL无法加载?”。如果LdrLoadDll返回状态!=0(是的,我理解你说的话,虽然可能只是因为你回复了IInspectable的第一条评论,你会注意到我在OP上发表了一条评论,支持你的建议。20年前,我可能会发布一个类似的答案。我现在知道,我当时不知道的是,写下你的意思是不够的n、 您还必须考虑读者可能会如何解释它。在这种情况下,典型的读者不会理解上下文,它将被解释为“如果LoadLibrary不工作,请尝试LdrLoadDll,它会更好”。有趣的是)您早些时候说的,只是称为GetLastError()在LoadLibraryExW之后。但是,如果您在测试中尝试LdrLoadDll-这只需要几分钟就可以理解,更重要的是,如果您发布的是实际代码而不是伪代码,我们会立即发现问题。我确实想过问这个问题,但假设108k代表用户会知道得更好。这会教给我,我猜猜看。@HarryJohnston我知道。我不可能发布实际的代码,因为,首先,它是专有代码,其次,它有很多依赖项。我觉得我发布的代码与真实的代码相当。在这种情况下,你会怎么做?要么(a)获得发布代码片段的权限,要么(b)测试我计划发布的代码,以确保它确实再现了问题。至少你可以避免告诉Joachim这是“我检查的第一件事”。——)@HarryJohnston我真的相信我确保了其间没有WinAPI调用,但结果证明我错了。