Программирование для Windows NT (том 2)



         

Состояние сервиса - часть 3


{

  static DWORD dwCheckPoint = 1;

  if(dwCurrentState == SERVICE_START_PENDING)

    ss.dwControlsAccepted = 0;

  else

    ss.dwControlsAccepted = SERVICE_ACCEPT_STOP;

  ss.dwCurrentState  = dwCurrentState;

  ss.dwWin32ExitCode = dwWin32ExitCode;

  ss.dwWaitHint      = dwWaitHint;

  if((dwCurrentState == SERVICE_RUNNING)

     (dwCurrentState == SERVICE_STOPPED))

    ss.dwCheckPoint = 0;

  else

    ss.dwCheckPoint = dwCheckPoint++;

  SetServiceStatus(ssHandle, &ss);

}

При заполнении структуры SERVICE_STATUS эта функция проверяет содержимое поля dwCurrentState. Если сервис находится в состоянии ожидания запуска, в поле допустимых команд dwControlsAccepted записывается нулевое значение. В противном случае функция записывает туда значение SERVICE_ACCEPT_STOP, в результате чего сервису может быть передана команда остановки. Далее функция заполняет поля dwCurrentState, dwWin32ExitCode и dwWaitHint значениями, полученными через параметры.

В том случае, когда сервис выполняет команды запуска или остановки, функция увеличивает значение счетчика шагов длительных операций dwCheckPoint. Текущее значение счетчика хранится в статической переменной dwCheckPoint, определенной в нашей функции.

После подготовки структуры SERVICE_STATUS ее адрес передается функции установки состояния сервиса SetServiceStatus.

Для определения текущего состояния сервиса вы можете использовать функцию QueryServiceStatus, прототип которой приведен ниже:

BOOL QueryServiceStatus(

  SC_HANDLE        schService,         // идентификатор сервиса

  LPSERVICE_STATUS lpssServiceStatus); // адрес структуры

                                       // SERVICE_STATUS 

Идентификатор сервиса вы можете получить от функций OpenService или CreateService, которые будут описаны ниже.




Содержание  Назад  Вперед