Функция обработки команд
Как следует из названия, функция обработки команд, зарегистрированная функцией RegisterServiceCtrlHandler, обрабатывает команды, передаваемые сервису операционной системой, другими сервисами или приложениями. Эта функция может иметь любое имя и выглядит следующим образом:
void WINAPI ServiceControl(DWORD dwControlCode)
{
switch(dwControlCode)
{
case SERVICE_CONTROL_STOP:
{
ss.dwCurrentState = SERVICE_STOP_PENDING;
ReportStatus(ss.dwCurrentState, NOERROR, 0);
// Выполняем остановку сервиса, вызывая функцию,
// которая выполняет все необходимые для этого действия
// ServiceStop();
ReportStatus(SERVICE_STOPPED, NOERROR, 0);
break;
}
case SERVICE_CONTROL_INTERROGATE:
{
ReportStatus(ss.dwCurrentState, NOERROR, 0);
break;
}
default:
{
ReportStatus(ss.dwCurrentState, NOERROR, 0);
break;
}
}
}
В приведенном выше фрагменте кода для сообщения процессу управления сервисами текущего состояния сервиса мы вызываем созданную нами функцию ReportStatus. Эта функция будет описана в следующем разделе.
Через единственный параметр функция обработки команд получает код команды, который может принимать одно из перечисленных ниже значений.
Значение | Описание | ||
SERVICE_CONTROL_STOP | Остановка сервиса | ||
SERVICE_CONTROL_PAUSE | Временная остановка сервиса | ||
SERVICE_CONTROL_CONTINUE | Продолжение работы сервиса после временной остановки | ||
SERVICE_CONTROL_INTERROGATE | Когда поступает эта команда, сервис должен немедленно сообщить процессу управления сервисами свое состояние | ||
SERVICE_CONTROL_SHUTDOWN | Сервис должен прекратить работу в течении 20 секунд, так как завершается работа операционной системы |