屏幕外渲染到win32服务中的纹理

时间:2009-02-04 22:20:57

标签: opengl windows-services

我正在尝试编写可以渲染到纹理的C ++窗口服务。我已将代码作为常规控制台应用程序运行,但在作为服务运行时wglGetProcAddress()返回NULL。

任何人都可以告诉我这是否可行,如果可以,我需要做些什么才能使OpenGL在服务流程中工作?


编辑:

我仍然没有在Vista下工作,但它在XP下运行。

3 个答案:

答案 0 :(得分:3)

您可以使用Mesa3D获得功能完备的软件渲染器。 只需构建Mesa3D并将opengl32.dll与您的应用程序一起构建在那里。 这应该使您能够使用OpenGL 2.1和扩展。 我们使用它来在Windows服务中测试Opengl应用程序。

答案 1 :(得分:1)

服务在非交互式桌面中运行。这些桌面不连接到计算机的物理显示设备,而是连接到逻辑显示设备。逻辑显示设备是非常基本的通用VGA设备,设置为1024 X 768,没有铃声和口哨声。

服务可以使用大多数GDI函数,但没有高级图形函数,如DirectX或OpenGL。所以你可以创建窗口,创建或检索设备上下文并做一些相当复杂的绘图和渲染,但除了简单的GDI(以及一些GDI +)之外你不能使用任何东西。

如果在wglGetProcAddress返回NULL后检查GetLastError,您应该知道失败的原因。

答案 2 :(得分:0)

OpenGL需要桌面访问才能创建渲染上下文,默认情况下服务没有桌面访问权。

您需要以交互模式运行服务。要执行此操作,请转到“管理工具”中的服务属性。在您设置服务登录用户的位置,您可以选择以交互模式运行服务,或类似“允许服务与桌面交互”之类的操作。您也可以尝试以其他用户身份登录该服务。

如果您正在使用.Net IIS应用程序,则还必须强制服务器的托管部分以其他用户身份登录。

修改

我忘了说,用户当前必须登录加速硬件桌面,并且不能锁定机器。这很糟糕,但这是我以前唯一的工作方式。我们有一个脏脚本,一旦机器启动就会记录用户。

作为旁注,我们使用的是DirectX,因此它可能不适用于OpenGL。