Функция ServiceMain службы


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

Функция ServiceMain должна выполнить следующие задачи:

  1. Вызвать функцию RegisterServiceCtrlHandlerEx, чтобы немедленно зарегистрировать функцию HandlerEx, которая обрабатывает управляющие запросы для службы. Возвращаемое значение функцией RegisterServiceCtrlHandlerEx - это дескриптор состояния службы (service status handle), который будет использоваться при вызовах, чтобы уведомлять Диспетчер управления службами (SCM) о состоянии службы.
  2. Выполнить инициализацию. Если время выполнения кода инициализации, как ожидается, будет очень коротким (меньше чем одна секунда), инициализация может быть выполнена непосредственно в ServiceMain.

    Если время инициализации ожидается более длительным, чем одна секунда, вызовите функцию SetServiceStatus, определяя состояние службы  как SERVICE_START_PENDING и ждите подсказки в структуре SERVICE_STATUS. По мере продвижения инициализация, служба должна сделать дополнительные вызовы функции SetServiceStatus, чтобы сообщать о ходе процесса. Отправка многократных вызовов SetServiceStatus полезна для отладки службы.

  3. Когда инициализация завершится, вызовите функцию SetServiceStatus, определяя состояние SERVICE_RUNNING в структуре SERVICE_STATUS.
  4. Выполните сервисные задачи, или, если нет никаких незаконченных задач, возвратите значение. Любое изменение в состоянии службы гарантирует вызов  SetServiceStatus, чтобы сообщить о новой информации о статусе.
  5. Если в то время , когда служба инициализируется или выполняется, происходит ошибка, функция ServiceMain должна вызвать функцию SetServiceStatus, чтобы в структуре SERVICE_STATUS определить состояние SERVICE_STOP_PENDING, если очистка памяти будет длительной. Как только очистка завершится,  чтобы закончить работу вызываем функцию SetServiceStatus из последнего потока, определяя состояние SERVICE_STOPPED в структуре SERVICE_STATUS. Убедитесь, что установили  в членах dwServiceSpecificExitCode и dwWin32ExitCode структуры SERVICE_STATUS идентификацию ошибок.

Дополнительную информацию смотри в статье Запись функции ServiceMain.

Назад в оглавление
На главную страницу

Hosted by uCoz