Opengl win32服务中纹理的屏幕外渲染 我尝试编写一个可以渲染到纹理的C++窗口服务。我已经将代码作为常规控制台应用程序使用,但作为服务运行时wglGetProcAddress()返回NULL

Opengl win32服务中纹理的屏幕外渲染 我尝试编写一个可以渲染到纹理的C++窗口服务。我已经将代码作为常规控制台应用程序使用,但作为服务运行时wglGetProcAddress()返回NULL,opengl,windows-services,Opengl,Windows Services,有人能告诉我这是否可能,如果可能,我需要做什么才能使OpenGL在服务流程中工作 编辑: 我还没有在Vista下使用它,但它在XP下确实可以使用。OpenGL需要桌面访问来创建渲染上下文,而服务默认情况下没有桌面访问权限 您需要以交互模式运行服务。为此,请进入管理工具中的服务属性。在您设置服务的登录用户的地方,您将有一个选项以交互模式运行服务,或者类似于“允许服务与桌面交互”。您也可以尝试以其他用户的身份记录服务 如果您正在使用.Net IIS应用程序,则还必须强制服务器的受管部分以其他用户身

有人能告诉我这是否可能,如果可能,我需要做什么才能使OpenGL在服务流程中工作


编辑:
我还没有在Vista下使用它,但它在XP下确实可以使用。

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

您需要以交互模式运行服务。为此,请进入管理工具中的服务属性。在您设置服务的登录用户的地方,您将有一个选项以交互模式运行服务,或者类似于“允许服务与桌面交互”。您也可以尝试以其他用户的身份记录服务

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

编辑:

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


作为补充说明,我们使用的是DirectX,因此它可能不适用于OpenGL。

OpenGL需要桌面访问来创建渲染上下文,并且默认情况下服务没有桌面访问权限

您需要以交互模式运行服务。为此,请进入管理工具中的服务属性。在您设置服务的登录用户的地方,您将有一个选项以交互模式运行服务,或者类似于“允许服务与桌面交互”。您也可以尝试以其他用户的身份记录服务

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

编辑:

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


另外,我们使用的是DirectX,因此它可能不适用于OpenGL。

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

服务可以使用大多数GDI功能,但不能使用DirectX或OpenGL等高级图形功能。因此,您可以创建窗口,创建或检索设备上下文,并进行一些相当复杂的绘图和渲染,但除了直接的GDI(和一些GDI+),您不能使用任何东西


如果在wglGetProcAddress返回NULL后检查GetLastError,则应获取失败的原因。

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

服务可以使用大多数GDI功能,但不能使用DirectX或OpenGL等高级图形功能。因此,您可以创建窗口,创建或检索设备上下文,并进行一些相当复杂的绘图和渲染,但除了直接的GDI(和一些GDI+),您不能使用任何东西


如果在wglGetProcAddress返回NULL后检查GetLastError,则应获得失败的原因。

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

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

我已经尝试过了,选中了“允许服务与桌面交互”框,但它仍然不起作用。有趣的是,CreateWindowEx()可以工作,我可以创建窗口句柄并获取消息,但wglGetProcAddress()不起作用。您是否尝试过其他置换,例如将“登录身份”更改为用户帐户而不是“本地系统帐户”?这不起作用,交互式桌面在一些基本的非加速模式下运行,非驱动GDI模式。正如JMD所说。我知道这将与DirectX一起工作,但OpenGL我不知道。我们做了一个实时3D渲染服务,却遇到了同样的问题。我们必须更改登录选项,还必须强制IIS登录其他用户。我已经尝试过了,选中了“允许服务与桌面交互”框,但仍然不起作用。有趣的是,CreateWindowEx()可以工作,我可以创建窗口句柄并获取消息,但wglGetProcAddress()不起作用。您是否尝试过其他置换,例如将“登录身份”更改为用户帐户而不是“本地系统帐户”?这不起作用,交互式桌面在一些基本的非加速模式下运行,非驱动GDI模式。正如JMD所说。我知道这将与DirectX一起工作,但OpenGL我不知道。我们做了一个实时3D渲染服务,却遇到了同样的问题。我们必须更改登录选项,还必须强制IIS登录到其他用户。我假设您在XP中通过将服务设置为与桌面交互,从而获得与物理设备的连接,从而使其正常工作。不幸的是,在Vista和更高版本中,这是不可能的,所有服务都在与交互式桌面分开的会话中运行,因此无法连接到它