如何通过编程找到DLL加载失败的原因
How do I programmatically find why a DLL fails to load?
我的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。
请注意,这是一个未记录的内部函数,因此您可能不希望在生产代码中使用它,但这将是一个有用的故障排除步骤,因为它应该会产生更有用的错误代码。
相关文章:
- 为什么 LoadLibrary 失败,而 LoadLibraryA 成功加载 DLL?
- 每次b/c程序无法加载级联时,使用harr级联的人脸识别都会失败
- jvm.dll 上的加载库失败,错误代码为 183
- 有时加载库会失败,错误代码为 126
- 在 SDL2 中加载像素着色器失败
- 无法在 Python 3.5 上导入 cv2 DLL 加载失败
- 如果应用程序从安装选项启动,则加载库失败,错误代码为 126
- .Net应用程序SideBySide加载失败COMException(0x80040154)
- 如果 QApplication 执行延迟,QWebEngineView 在加载内容时会以静默方式失败
- 加载挡板扩展失败
- Vulkan-加载扩展时实例创建失败
- 延迟加载opengl32.dll失败,出现Qt5
- SFML图像加载在发布版本上失败 - 文件名损坏
- 加载库 ..失败.缺少 DLL
- 模块"MyShellExt.dll"加载失败
- 在管道中调用时,从 std::cin 加载 pugi::xml_document 失败
- 如果静态和动态加载了libcrypto,则两次加载的动态/共享库/RSA_check_key将失败
- 在某些计算机上加载C++DLL失败
- 使用GetOpenFileName检索xml文件名后,tinyxml加载失败
- OpenGL着色器加载失败