Поделиться через


Переходы состояния службы

Служба отвечает за отправку отчетов об изменениях в своем состоянии диспетчеру управления службами (SCM). Программы управления службами и система могут узнать состояние службы только из SCM, поэтому важно, чтобы служба правильно сообщала о своем состоянии. Служба сообщает о своем состоянии, вызывая функцию SetServiceStatus с указателем на полностью инициализированную SERVICE_STATUS структуру. Элемент dwCurrentState структуры содержит состояние службы для отчета.

Начальное состояние службы — SERVICE_STOPPED. Когда служба SCM запускает службу, она устанавливает состояние службы в SERVICE_START_PENDING и вызывает функцию ServiceMain службы. Затем служба завершает свою инициализацию, используя один из методов, описанных в разделе Service ServiceMain Function. После завершения инициализации службы и готовности к получению запросов на управление служба вызывает SetServiceStatus , чтобы сообщить о SERVICE_RUNNING и указать запросы управления, которые служба готова принять. Переход с SERVICE_START_PENDING на SERVICE_RUNNING указывает средствам SCM и мониторинга служб, что служба успешно запущена. Если служба сообщает о состоянии, отличном от SERVICE_RUNNING, средства SCM или средства мониторинга служб могут пометить службу как не удается запуститься.

SCM отправляет службе только указанные управляющие запросы (за исключением запроса SERVICE_CONTROL_INTERROGATE, который отправляется всегда). Список запросов элементов управления, которые может принимать служба, см. в разделе Элемент dwControlsAccepted структуры SERVICE_STATUS . Сведения о регистрации для получения событий устройства см. в разделе Функция RegisterDeviceNotification .

Состояние службы обычно изменяется в результате обработки запроса элемента управления. Управляющие запросы, вызывающие изменение состояния службы, включают SERVICE_CONTROL_STOP, SERVICE_CONTROL_PAUSE и SERVICE_CONTROL_CONTINUE. Если служба должна выполнять длительную обработку для обработки любого из этих запросов, она должна создать дополнительный поток для выполнения длительной обработки и сообщить о соответствующем состоянии ожидания в SCM. (Для обеспечения оптимальной производительности в Windows Vista и более поздних версиях Windows служба должна использовать для этой цели рабочий поток из пула потоков .) После завершения длительной обработки служба должна сообщить о завершенном переходе состояния. Дополнительные сведения об обработке запросов элементов управления см. в разделе Service Control Handler Function.

Допустимы только определенные переходы состояния службы. На следующей схеме показаны допустимые переходы.

Допустимые переходы состояния службы

Состояние службы, сообщаемое SCM, определяет, как SCM взаимодействует со службой. Например, если служба сообщает SERVICE_STOP_PENDING, SCM не передает дальнейшие управляющие запросы в службу, так как это состояние указывает на завершение работы службы. Следующее состояние, сообщаемое службой, должно быть SERVICE_STOPPED, так как это единственное допустимое состояние после SERVICE_STOP_PENDING. Однако если служба сообщает о недопустимом переходе, SCM не завершает вызов.

На следующей схеме более подробно показаны переходы состояния службы, включая запросы управления, инициированные программой управления службой (клиентом службы), и вызовы SetServiceStatus , выполняемые службой для передачи отчетов об изменениях состояния в SCM. Как упоминалось ранее, SCM отправляет только управляющие запросы, которые служба указала, что она будет принимать, поэтому служба может не получать все запросы, показанные на схеме.

Подробные сведения о переходе состояния службы

ControlService

ControlServiceEx

SetServiceStatus