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

How do I programmatically find why a DLL fails to load?

本文关键字:失败 加载 DLL 何通过 编程      更新时间:2023-10-16

我的C++程序调用LoadLibraryEx()来加载第三方DLL。结果是一个null句柄-它无法加载。调用GetLastError()之后返回零,这没有多大用处,但至少它不是一个丢失的DLL文件。

代码如下:

 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。

如果你不能使用DependencyWalker,那么你可以尝试使用文章中描述的技术,比如:

如何用程序确定windows可执行文件DLL的依赖关系?

好的,所以我检查得更好了——事实上,还有另一个WinAPI调用导致"最后一个错误"在LoadLibraryEx()之后被覆盖。它隐藏在几层C++辅助对象的深处,所以我之前没有注意到它。所以这是调用程序代码中的一个错误,而真正的"最后一个错误"是非零的。

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

作为故障排除措施,您应该尝试LdrLoadDll而不是LoadLibraryEx。

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