我需要在 Windows 7 上的 Qt5 项目中使用 OpenGL 版本 2 功能(Qt 是使用桌面 OpenGL 而不是 ANGLE 构建的)。为了支持通过远程桌面运行应用程序,我想在必要时通过 Mesa 进行软件渲染。我的计划是在启动时检查 OpenGL 版本。如果它太低,我在应用程序设置中设置一个标志,打印一条消息并终止程序。当程序再次启动时,我可以读取标志并决定是否需要从 Mesa 而不是 Windows 的内置版本加载 opengl32.dll。
为了让它工作,我尝试通过设置/DELAYLOAD:opengl32.dll
链接器标志延迟加载 opengl32.dll,然后使用SetDllDierectoryW([path to dir with Mesa's opengl32.dll])
重定向 dll 查找。不幸的是,这不起作用,因为 opengl32.dll 的内置版本在进入后就已经在内存中main()
,因此SetDllDirectory
没有效果。
Dependency Walker 向我展示了 Qt5Gui.dll 本身与 opengl32.dll 相关联,我怀疑这会破坏延迟加载。但是,当我尝试延迟加载 Qt5Gui.dll 时,链接器由于导入的符号而失败"__declspec(dllimport) public: static struct QMetaObject const QWindow::staticMetaObject" (__imp_?staticMetaObject@QWindow@@2UQMetaObject@@B)
。我不知道如何摆脱这个。
我真的需要 OpenGL 2,所以似乎没有办法使用 Mesa 进行软件渲染。但我也想不出延迟加载的替代方案。每当我想在硬件和软件渲染之间切换时更改 PATH 设置似乎不起作用,并且通过将 Mesa 的 opengl32.dll 移入或移出应用程序目录进行切换不是一个选项,因为普通用户不应该有所需的写入权限。
有什么方法可以延迟加载使用 Qt5 的 opengl32.dll 吗?