Почему формы не работают в службах Windows - PullRequest
0 голосов
/ 19 марта 2009

Я понимаю, что у служб Windows нет десктопов, и они не могут получить прямой доступ ни к одному из десктопов пользователя (действительно, они могут работать, когда нет загруженного десктопа). Почему при запуске формы в службе Windows возникает ошибка?

Ответы [ 7 ]

2 голосов
/ 19 марта 2009

Вы должны понимать три взаимосвязанных понятия: сеансы, оконные станции и рабочие столы. Но поскольку между сеансами и станциями существуют взаимно-однозначные отношения, мы можем широко игнорировать станции для этого обсуждения. Сеанс содержит станцию ​​(winSta0 - единственная интерактивная станция), а станции содержат один или несколько рабочих столов.

Теперь архитектура сессии отличается в зависимости от версии Windows. Для NT <= 5 (XP / 2003 и все, что до них) службы выполняются в сеансе 0 вместе с приложениями интерактивного пользователя. Вот почему вы можете настроить службы для взаимодействия с рабочим столом в этих версиях Windows NT - они находятся в одном сеансе. Для NT> = 6 (Vista, Server 2008 и далее) службы существуют в сеансе 0, но интерактивный рабочий стол находится в другом сеансе. Это то, что известно как «усиление службы», и в основном это исправление безопасности.

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

Просто чтобы сделать это еще более запутанным, в Vista есть временный ключ для решения этой ситуации: если приложение в сеансе 0 пытается создать диалоговое окно, Windows перехватит это и выдаст предупреждение пользователю, чтобы они переключились на ( Я предполагаю временный рабочий стол, где они могут взаимодействовать с диалогом. Однако эта мера явно временная, и на нее нельзя полагаться в будущих выпусках Windows. Я видел, как это работает в нативном коде, но я подозреваю, что вы находитесь в управляемом коде, и среда выполнения достаточно умна, чтобы уловить ваше поведение и доставить метафорический удар по задним конечностям: -).

2 голосов
/ 19 марта 2009

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

2 голосов
/ 19 марта 2009

Ммм ... что и на чьём рабочем столе эта форма появится? «Рабочий стол» - это концепция операционной системы: каждый дескриптор окна принадлежит конкретному рабочему столу в пределах оконной станции, принадлежащей одному (интерактивному) пользователю. Процесс, в котором выполняется служба, не найдет видимый рабочий стол пользователя на своей оконной станции. Для довольно сухой ссылки, посмотрите на MSDN .

На самом деле, это даже противнее . Возможно, вы сможете настроить разрешения для службы, чтобы иметь возможность создавать рабочий стол - но тогда никто не увидит это! В качестве альтернативы, вы можете предоставить процессу права на переключение между рабочими столами и запутать пользователя!

1 голос
/ 20 марта 2009

Когда служба Windows запущена, она назначается Window Station и рабочему столу в соответствии с хорошо документированными, хотя и несколько неясными правилами. Как уже упоминалось в другом месте, он не назначается интерактивному рабочему столу (если он не настроен для взаимодействия с рабочим столом в ОС до Vista), но он определенно работает на рабочем столе.

Распространено заблуждение, что сервисы не могут использовать элементы пользовательского интерфейса. Фактически многие службы (такие как SQL Server) в прошлом использовали скрытые окна и сообщения окон для синхронизации потоков и распределения работы. Нет никаких причин, по которым форма не может быть показана в сервисе. Если вы получаете сообщение об ошибке, это связано с тем, что вы делаете с формой или каким-либо компонентом, который находится в форме. Наиболее вероятные проблемы связаны с тем, нужен ли вам поток STA для вашей формы, или вы создаете насос сообщений для своей формы или что-то подобное.

Хотя вы, безусловно, можете использовать форму в службе Windows, вы почти наверняка не должны. Будут проблемы с многопоточностью, вызовы между квартирами, возможные проблемы с пользовательским интерфейсом и т. Д. Есть очень немного ситуаций, когда использование окна в службе является хорошим выбором, но есть лучший способ, без пользовательского интерфейса, в 99,99% все дела.

1 голос
/ 19 марта 2009

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

Чтобы увидеть это, щелкните правой кнопкой мыши Мой компьютер => Управление => Службы и приложения => Службы. Дважды щелкните сервис, чтобы получить доступ к его свойствам. На вкладке «Вход в систему» ​​есть флажок для этого параметра.

Вот статья о том, как установить его программно в C #

[Редактировать] Как отмечает Стивен Мартин в комментариях: это действительный совет только для версий Windows, предшествующих Vista.

1 голос
/ 19 марта 2009

Потому что, если никто не увидит Форму, никто не собирается ее отклонять - запуск модального диалога - это рецепт зависания - поэтому вы хотите, чтобы он громко жаловался, когда это происходит, а не сидел тихо, пока вы не убьете процесс (или посмотрите на трассировку стека, чтобы определить, что происходит). (Другая очевидная проблема заключается в том, кто выберет DialogResult, если существует более одной возможности?) Вы хотите знать, когда это происходит. (Утверждать диалоги, которые не выдают, если они не могут показать что-либо, - забавный способ сводить людей с ума.).

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

(я предполагаю, что вы используете Windows Forms в .NET, хотя вы не пометили его как таковой)

(Если вы правильно настроили вещи так, что службе разрешено взаимодействовать с рабочим столом, вы не получите исключение)

0 голосов
/ 19 марта 2009

Потому что в то время, когда операционной системе нужно рисовать окно, форма для рисования не на чем.

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