Внеэкранный рендеринг на текстуру в сервисе win32 - PullRequest
1 голос
/ 05 февраля 2009

Я пытаюсь написать службу Windows C ++, которая может отображать текстуру. У меня есть код, работающий как обычное консольное приложение, но при запуске в качестве службы wglGetProcAddress() возвращает NULL.

Может кто-нибудь сказать мне, если это возможно, и если да, что мне нужно сделать, чтобы OpenGL работал внутри процесса обслуживания?


Edit:

У меня до сих пор не работает эта функция в Vista, но она работает в XP.

Ответы [ 3 ]

3 голосов
/ 19 февраля 2009

С помощью Mesa3D вы можете получить полностью работоспособный программный рендер. Просто соберите Mesa3D и поместите встроенный туда opengl32.dll вместе с вашим приложением. Это должно позволить вам использовать OpenGL 2.1 и расширения. Мы используем это для тестирования приложений Opengl в службе Windows.

1 голос
/ 05 февраля 2009

Службы работают в неинтерактивных рабочих столах. Эти рабочие столы не подключаются к физическому устройству отображения компьютера, а скорее к логическим устройствам отображения. Устройства с логическим дисплеем являются базовыми устройствами VGA, настроенными на 1024 X 768 без наворотов.

Сервисы могут использовать большинство функций GDI, но не могут использовать расширенные графические функции, такие как DirectX или OpenGL. Таким образом, вы можете создавать окна, создавать или извлекать контексты устройства и выполнять довольно сложные рисование и рендеринг, но вы не можете использовать ничего, кроме простого GDI (и некоторых GDI +).

Если вы проверяете GetLastError после того, как wglGetProcAddress возвращает NULL, вы должны получить причину ошибки.

0 голосов
/ 05 февраля 2009

OpenGL необходим доступ к рабочему столу для создания контекста рендеринга, а служба по умолчанию не имеет доступа к рабочему столу.

Вам необходимо запустить сервис в интерактивном режиме. Для этого зайдите в свойства сервиса в Администрирование. Там, где вы устанавливаете учетную запись пользователя службы, у вас будет возможность запустить службу в интерактивном режиме или что-то вроде «Разрешить службе взаимодействовать с рабочим столом». Вы также можете попробовать войти в службу как другой пользователь.

Если вы работаете с приложением .Net IIS, вам также придется заставить управляемую часть сервера регистрироваться как другой пользователь.

EDIT:

Я забыл сказать, что в данный момент пользователь должен войти на рабочий стол с аппаратным ускорением, и машина не должна быть заблокирована. Это отстой, но это единственный способ, которым я заставил это работать раньше. У нас был грязный скрипт, который регистрировал пользователя сразу после запуска машины.

В качестве дополнительного примечания мы использовали DirectX, поэтому он может не относиться к OpenGL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...