Следующий пример использует функцию ControlService, чтобы отправить значение управления запущенной службе. Другие значения управления требуют других уровней доступа к объекту службы. Например, дескриптор объекта службы должен иметь доступ SERVICE_STOP, чтобы отправить управляющий код SERVICE_CONTROL_STOP. Когда ControlService возвращает значение, структура SERVICE_STATUS имеет в своем составе самую последнюю информацию о состоянии службы.
BOOL ControlSampleService(DWORD fdwControl) { SERVICE_STATUS ssStatus; DWORD fdwAccess; DWORD dwStartTickCount, dwWaitTime; // Необходимый доступ объекта службы зависит от управления. switch (fdwControl) { case SERVICE_CONTROL_STOP: fdwAccess = SERVICE_STOP; break; case SERVICE_CONTROL_PAUSE: case SERVICE_CONTROL_CONTINUE: fdwAccess = SERVICE_PAUSE_CONTINUE; break; case SERVICE_CONTROL_INTERROGATE: fdwAccess = SERVICE_INTERROGATE; break; default: fdwAccess = SERVICE_INTERROGATE; } // Открываем дескриптор службы. schService = OpenService( schSCManager, // база данных SCManager TEXT("Sample_Srv"), // имя службы fdwAccess); // заданный доступ if (schService == NULL) { printf("OpenService failed (%d)\n", GetLastError()); return FALSE; } // Отправляем значение управления службе. if (!ControlService( schService, // дескриптор службы fdwControl, // отправляемое управляющее значение &ssStatus) ) // адрес информации состояния { printf("ControlService failed (%d)\n", GetLastError()); return FALSE; } // Вывод данных о состоянии службы. printf("\nStatus of Sample_Srv: \n"); printf(" Service Type: 0x%x\n", ssStatus.dwServiceType); printf(" Current State: 0x%x\n", ssStatus.dwCurrentState); printf(" Controls Accepted: 0x%x\n", ssStatus.dwControlsAccepted); printf(" Exit Code: %d\n", ssStatus.dwWin32ExitCode); printf(" Service Specific Exit Code: %d\n", ssStatus.dwServiceSpecificExitCode); printf(" Check Point: %d\n", ssStatus.dwCheckPoint); printf(" Wait Hint: %d\n", ssStatus.dwWaitHint); return TRUE; } |