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