Когда сервисная программа
управления требует, чтобы была
запущена новая служба, Диспетчер
управления службами (SCM) запускает службу и
отправляет стартовый запрос диспетчеру
управления. Диспетчер управления создает
новый поток, чтобы выполнить функцию ServiceMain
для службы.
Функция ServiceMain должна выполнить
следующие задачи:
Вызвать функцию RegisterServiceCtrlHandlerEx,
чтобы немедленно зарегистрировать
функцию HandlerEx, которая
обрабатывает управляющие запросы для
службы. Возвращаемое значение функцией
RegisterServiceCtrlHandlerEx - это дескриптор
состояния службы (service status handle),
который будет использоваться при вызовах,
чтобы уведомлять Диспетчер управления
службами (SCM) о состоянии службы.
Выполнить инициализацию. Если
время выполнения кода инициализации, как
ожидается, будет очень коротким (меньше
чем одна секунда), инициализация может
быть выполнена непосредственно в ServiceMain.
Если
время инициализации ожидается более
длительным, чем одна секунда, вызовите
функцию SetServiceStatus,
определяя состояние службы как SERVICE_START_PENDING
и ждите подсказки в структуре SERVICE_STATUS.
По мере продвижения инициализация,
служба должна сделать дополнительные
вызовы функции SetServiceStatus, чтобы сообщать о
ходе процесса. Отправка
многократных вызовов SetServiceStatus полезна
для отладки службы.
Когда инициализация завершится,
вызовите функцию SetServiceStatus, определяя
состояние SERVICE_RUNNING в
структуре SERVICE_STATUS.
Выполните сервисные задачи, или,
если нет никаких незаконченных задач,
возвратите значение. Любое изменение в
состоянии службы гарантирует вызов
SetServiceStatus, чтобы сообщить о новой
информации о статусе.
Если в то время , когда служба
инициализируется или выполняется, происходит ошибка, функция ServiceMain должна вызвать функцию
SetServiceStatus, чтобы
в структуре SERVICE_STATUS определить состояние
SERVICE_STOP_PENDING, если очистка
памяти будет
длительной. Как только очистка
завершится, чтобы закончить работу
вызываем функцию SetServiceStatus из последнего потока,
определяя состояние SERVICE_STOPPED в
структуре SERVICE_STATUS. Убедитесь, что
установили в членах dwServiceSpecificExitCode
и dwWin32ExitCode структуры SERVICE_STATUS
идентификацию ошибок.