Передача запросов на управление службе


Следующий пример использует функцию 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; 
}

 

Назад в оглавление
На главную страницу

Hosted by uCoz