Что Сервисы могут делать под Windows? - PullRequest
2 голосов
/ 23 сентября 2008

У кого-нибудь есть хорошее руководство по возможностям Windows Services под XP? В частности, я пытаюсь выяснить, что происходит, когда программа, запускаемая как служба, пытается открыть окна, но не получила разрешения на взаимодействие с рабочим столом.

По сути, у меня есть программа, которая является / была приложением с графическим интерфейсом, которая должна быть в состоянии работать как служба для долгосрочной фоновой обработки. Переписать программу так, чтобы она не отображала элементы GUI при выполнении фоновой обработки, - это серьезное усилие, поэтому я хотел бы посмотреть, есть ли способ игнорировать элементы UI. Сейчас это работает, если слишком много окон не открыто. Я пытаюсь выяснить, с какими ограничениями я могу столкнуться. В идеале, должна быть страница MSDN, в которой это обсуждается, но мне пока не повезло найти ее.

Ответы [ 5 ]

8 голосов
/ 23 сентября 2008

Как правило, службы должны быть спроектированы таким образом, чтобы не иметь видимого пользовательского интерфейса. Весь смысл службы в том, чтобы работать в фоновом режиме, без пользовательского интерфейса, без присмотра. (Вспомните SQL Server, IIS и т. Д.)

В большинстве случаев отдельное приложение контролирует работу службы, если требуется графический интерфейс. (Продолжая примеры, которые я только что упомянул, SQL Server Management Studio, IIS Manager и т. Д.) Эти отдельные приложения настраивают и манипулируют службой (и иногда, если необходимо, отказывают упомянутой службе).

Если вашей службе требуется случайный пользовательский интерфейс, и он сказал, что пользовательский интерфейс не может быть изолирован от управляющего приложения, то вам, вероятно, следует пересмотреть тот факт, что вы используете службу с самого начала. Возможно, приложение пользовательского интерфейса, которое находится в области системных уведомлений, является правильным шаблоном для использования? (Например, Windows Live Communicator.)

2 голосов
/ 23 сентября 2008

A service в Microsoft Windows - это программа, которая запускается всякий раз, когда на компьютере установлена ​​операционная система. Это не требует, чтобы пользователь вошел в систему. Службы необходимы для выполнения независимых от пользователя задач, таких как репликация каталогов, мониторинг процессов или службы для других компьютеров в сети, например поддержка протокола HTTP HTTP

Обычно это реализовано в виде консольного приложения, которое работает в фоновом режиме и выполняет задачи, не требующие взаимодействия с пользователем.

Установленные службы могут быть настроены через апплет Services, доступный из Control Panel --> Administrative Tools в Windows 2000 / XP.

Службы можно настроить на автоматический запуск при запуске операционной системы, поэтому вам не нужно запускать каждую из них вручную после перезагрузки системы.

  1. Создание простой службы - статья MSDN
  2. Создание служб Windows стало проще - статья по проекту кода
  3. Пять шагов к написанию служб Windows в C - статья DevX
1 голос
/ 23 сентября 2008

Служба в Windows XP может взаимодействовать с рабочим столом, если установлен флажок «Разрешить взаимодействие службы с рабочим столом» (MMC -> свойства службы -> вкладка «Вход в систему»). Это также можно сделать, выполнив следующие действия:

hWinstation = OpenWindowStation("winsta0", FALSE, MAXIMUM_ALLOWED);
SetProcessWindowStation(hWinstation);
hDesktop = OpenDesktop("default", 0, FALSE, MAXIMUM_ALLOWED);
SetThreadDesktop(hDesk);

Но имейте в виду, что представление пользовательского интерфейса из сервисного процесса в Windows XP почти всегда приводит к проблеме безопасности (см. Атака Shatter ). Вы должны попытаться отделить часть интерфейса вашего приложения от службы.

1 голос
/ 23 сентября 2008

Если вы подумаете о том, чтобы в конечном итоге перейти на более новую ОС, такую ​​как Vista или Server 2008, вы обнаружите, что вообще не можете дать сервису разрешение на взаимодействие с рабочим столом. Следовательно, с точки зрения прямой совместимости, вы должны разрабатывать свой сервис так, чтобы он не требовался.

0 голосов
/ 23 сентября 2008

Обычно служба не имеет разрешения на запись на оконную станцию ​​и рабочий стол, поэтому она не будет работать; даже запуск приложений, загружающих user32.dll, может завершиться сбоем просто потому, что user32 имеет код инициализации, который хочет связаться с оконной станцией и не может получить к нему доступ, если служба не запущена от имени администратора.

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