Как мы уже говорили, сервис может сообщить процессу управления сервисами свое состояние, для чего он должен вызвать функцию SetServiceStatus. Прототип этой функции мы привели ниже:
BOOL SetServiceStatus(
SERVICE_STATUS_HANDLE sshServiceStatus, // идентификатор
// состояния сервиса
LPSERVICE_STATUS lpssServiceStatus); // адрес структуры,
// содержащей состояние сервиса
Через параметр sshServiceStatus функции SetServiceStatus вы должны передать идентификатор состояния сервиса, полученный от функции RegisterServiceCtrlHandler.
В параметре lpssServiceStatus вы должны передать адрес предварительно заполненной структуры типа SERVICE_STATUS:
typedef struct _SERVICE_STATUS
{
DWORD dwServiceType; // тип сервиса
DWORD dwCurrentState; // текущее состояние сервиса
DWORD dwControlsAccepted; // обрабатываемые команды
DWORD dwWin32ExitCode; // код ошибки при запуске
// и остановке сервиса
DWORD dwServiceSpecificExitCode; // специфический код ошибки
DWORD dwCheckPoint; // контрольная точка при
// выполнении длительных операций
DWORD dwWaitHint; // время ожидания
} SERVICE_STATUS, *LPSERVICE_STATUS;
В поле dwServiceType необходимо записать один из перечисленных ниже флагов, определяющих тип сервиса:
Флаг |
Описание |
SERVICE_WIN32_OWN_PROCESS |
Сервис работает как отдельный процесс |
SERVICE_WIN32_SHARE_PROCESS |
Сервис работает вместе с другими сервисами в рамках одного и того же процесса |
SERVICE_KERNEL_DRIVER |
Сервис представляет собой драйвер операционной системы Microsoft Windows NT |
SERVICE_FILE_SYSTEM_DRIVER |
Сервис является драйвером файловой системы |
SERVICE_INTERACTIVE_PROCESS |
Сервисный процесс может взаимодействовать с программным интерфейсом рабочего стола Desktop |
В поле dwCurrentState вы должны записать текущее состояние сервиса. Здесь можно использовать одну из перечисленных ниже констант:
Константа |
Состояние сервиса |
SERVICE_STOPPED |
Сервис остановлен |
SERVICE_START_PENDING |
Сервис находится в состоянии запуска, но еще не работает |
SERVICE_STOP_PENDING |
Сервис находится в состоянии остановки, но еще не остановился |
SERVICE_RUNNING |
Сервис работает |
SERVICE_CONTINUE_PENDING |
Сервис начинает запускаться после временной остановки, но еще не работает |
SERVICE_PAUSE_PENDING |
Сервис начинает переход в состояние временной остановки, но еще не остановился |
SERVICE_PAUSED |
Сервис находится в состоянии верменной остановки |