我正在开发一款在 Windows XP 和 Windows Vista 之间的所有 Windows 版本上运行的 C++ 软件。在我的代码中,我开发了一个链接到标准库(Qt 库)的 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() 调用完全失败的更多信息?