Точка входа сервиса
Точка входа сервиса - это функция, адрес которой записывается в поле lpServiceProc массива структур SERVICE_TABLE_ENTRY. Имя функции может быть любым, а прототип должен быть таким, как показанный ниже:
void WINAPI ServiceMain(DWORD dwArgc, LPSTR *lpszArgv);
Точка входа сервиса вызывается при запуске сервиса функцией StartService (эту функцию мы рассмотрим позже). Через параметр dwArgc передается счетчик аргументов, а через параметр lpszArgv - указатель на массив строк параметров. В качестве первого параметра всегда передается имя сервиса. Остальные параметры можно задать при запуске сервиса функцией StartService.
Функция точки входа сервиса должна зарегистрировать функцию обработки команд и выполнить инициализацию сервиса.
Первая задача решается с помощью функции RegisterServiceCtrlHandler, прототип которой приведен ниже:
SERVICE_STATUS_HANDLE RegisterServiceCtrlHandler(
LPCTSTR lpszServiceName, // имя сервиса
LPHANDLER_FUNCTION lpHandlerProc); // адрес функции
// обработки команд
Через первый параметр этой функции необходимо передать адрес текстовой строки имени сервиса, а через второй - адрес функции обработки команд (функция обработки команд будет рассмотрена ниже).
Вот пример использования функции RegisterServiceCtrlHandler:
SERVICE_STATUS_HANDLE ssHandle;
ssHandle =
RegisterServiceCtrlHandler(MYServiceName, ServiceControl);
Функция RegisterServiceCtrlHandler в случае успешного завершения возвращает идентификатор состояния сервиса. При ошибке возвращается нулевое значение.
Заметим, что регистрация функции обработки команд должна быть выполнена немедленно в самом начале работы функции точки входа сервиса.
Теперь перейдем к решению второй задачи - инициализации сервиса.
В процессе инициализации функция точки входа сервиса выполняет действия, которые зависят от назначения сервиса. Необходимо, однако, помнить, что без принятия дополнительных мер инициализация должна выполняться не дольше одной секунды.
А что делать, если инициализация сервиса представляет собой достаточно длительный процесс?
В этом случае перед началом инициализации функция точки входа сервиса должна сообщить процессу управления сервисами, что данный сервис находится в состоянии ожидания запуска. Это можно сделать с помощью функции SetServiceStatus, которая будет описана позже. Перед началом инициализации вы должны сообщить процессу управления сервисами, что сервис находится в состоянии SERVICE_START_PENDING.
После завершения инициализации функция точки входа сервиса должна указать процессу управления сервисами, что процесс запущен и находится в состоянии SERVICE_RUNNING.