c++ - 优雅地捕获 LoadLibrary() 错误

标签 c++ windows qt plugins loadlibrary

我正在开发一款 C++ 软件,它可以在 Windows XP 和 Windows Vista 之间的所有 Windows 版本上运行。在我的代码中,我开发了一个链接到标准库(Qt library)的 DLL。一旦部署了我的软件,用户在他的系统上没有完全相同的 Qt 构建但配置略有不同的情况并不罕见。可能有一些功能被禁用(因此他们的 Qt 构建不会导出相同的符号集)或者库甚至可能被更改,使库二进制文件与原始库不兼容。

有时,我通过 LoadLibrary() 调用加载我的 DLL。这将引入用户系统上的任何 Qt 库。如果幸运的话,他们的 Qt 构建与我在开发 DLL 时使用的兼容,所以 LoadLibrary() 成功了。但是,根据他们对 Qt 构建所做的更改,LoadLibrary() 调用有时会失败并显示

  • “找不到指定的模块。”;如果他们的 Qt 构建包含的 DLL 少于我的 Qt 构建,通常会发生这种情况。所以我的 DLL 尝试加载例如QtFoo.dll 但由于此 dll 不是他们 Qt 构建的一部分,因此加载我的 DLL 失败。
  • “找不到指定的过程。”;如果他们更改 Qt 构建以禁用某些功能,这通常会发生这种情况,这会导致导出的符号较少。

我的问题是:如何优雅地捕获这些错误?对,我只是简单地使用 GetLastError() 然后打印上面两条消息中的一条。但是,如果我知道找不到哪个模块,或者哪个过程丢失,这将有用。我注意到,当在资源管理器中运行一个链接到丢失的 DLL 的应用程序时,资源管理器设法产生一个很好的“由于缺少所需的库 blah.dll,无法加载应用程序 foo”。是否有一些 API 可用于获取有关 LoadLibrary() 调用为何完全失败的更多信息?

最佳答案

At some point, I'm loading my DLL via a LoadLibrary() call. This pulls in whatever Qt library is on the user's system.

不要这样做!你遇到的错误是幸运的,因为它很容易破坏内存和崩溃。 发布 Qt 应用程序的规范方式是发布 DLL 或静态链接。查看帮助文件中的 Qt 部署指南。

稍后编辑:

在阅读了您的评论后,我仍然不建议您使用这种方法,因为您无法确定 DLL 是否二进制兼容,即使它们已加载,这可能会导致难以跟踪的错误。

不过,我相信您可以拦截 LoadLibrary 调用并查看哪些调用失败。女士Detours库可以用于此。另见 this Stackoverflow 问题。

关于c++ - 优雅地捕获 LoadLibrary() 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1298316/

相关文章:

c++ - 什么是 undefined reference /未解析的外部符号错误以及如何修复它?

c++ - printf 语句中的 "%3d"是什么意思?

windows - Git Bash 控制台在打开时崩溃

c++ - 如何设置 Xcode 来代替 Qt Creator 工作?

Qt 插件不工作

c++ - (C++) 使用节点/链表时得到不一致的结果。

c++ - 手动在场景上绘制 QPolygonF 会导致更新时出现渲染问题

java - 无法找到或加载主类文件

windows - 将代码从 Linux 移植到 Windows

c++ - 我可以将 QObject 数组的单个元素移动到另一个 QThread