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


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

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

Начальное состояние службы — SERVICE_STOPPED. При запуске службы SCM оно задает состояние службы для SERVICE_START_PENDING и вызывает функцию ServiceMain serviceMain. Затем служба завершает инициализацию с помощью одного из методов, описанных в 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 служба должна использовать рабочий поток из пула потоков для этой цели.) Затем служба должна сообщить о завершенном переходе состояния после завершения длительной обработки. Дополнительные сведения об обработке запросов на управление см. в функции обработчика управления службами.

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

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

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

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

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

ControlService

ControlServiceEx

SetServiceStatus