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


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

Чтобы запустить службу или службу драйверов, программа управления службами использует функцию 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 возвращается после завершения инициализации драйвера устройства.

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