Поделиться через


Запуск службы

Чтобы запустить службу или службу драйверов, программа управления службами использует функцию StartService . Функция StartService завершается сбоем, если база данных заблокирована. В этом случае программа управления службой должна подождать несколько секунд и снова вызвать StartService . Он может проверка текущее состояние блокировки базы данных, вызвав функцию QueryServiceLockStatus.

Если программа управления службой запускает службу, она может использовать функцию StartService для указания массива аргументов, передаваемых в функцию ServiceMain службы. Функция StartService возвращается после создания нового потока для выполнения функции ServiceMain . Программа управления службой может получить состояние только что запущенной службы в структуре SERVICE_STATUS путем вызова функции QueryServiceStatus . Во время инициализации элемент dwCurrentState должен быть SERVICE_START_PENDING. Элемент dwWaitHint — это интервал времени в миллисекундах, который указывает, сколько времени должна ожидать программа управления службой перед повторным вызовом QueryServiceStatus . После завершения инициализации служба изменяет dwCurrentState на SERVICE_RUNNING.

Диспетчер управления службами не поддерживает передачу пользовательских переменных среды в службу при запуске. Кроме того, диспетчер управления службой не обнаруживает и не передает изменения в переменные среды во время работы службы. Вместо того, чтобы сделать службу зависимой от переменной среды, используйте значения реестра или аргументы ServiceMain .

Ниже приведен упрощенный обзор того, что происходит при запуске типичной службы диспетчером управления службами.

  • SCM считывает путь службы из реестра и готовится к запуску службы. Сюда входит получение блокировки службы. Любая попытка запустить другую службу во время блокировки службы будет блокироваться до тех пор, пока блокировка службы не будет снята.
  • SCM запускает процесс и ожидает завершения дочернего процесса (что указывает на сбой) или сообщит о состоянии SERVICE_RUNNING.
  • Приложение выполняет очень простую инициализацию и вызывает функцию StartServiceCtrlDispatcher .
  • StartServiceCtrlDispatcher подключается к диспетчеру управления службой и запускает второй поток, который вызывает функцию ServiceMain для службы. ServiceMain должен как можно скорее сообщить о SERVICE_RUNNING.
  • Когда диспетчер управления службами получает уведомление о том, что служба запущена, он снимает блокировку службы.

Если служба не обновляет свое состояние в течение 80 секунд, а также последнее указание ожидания, диспетчер управления службой определяет, что служба перестала отвечать. Диспетчер управления службами зановит событие в журнал и остановит службу.

Если программа запускает службу драйверов, startService возвращается после завершения инициализации драйвера устройства.

Дополнительные сведения см. в разделе Запуск службы.