Функция StartService


Функция StartService запускает службу.

Синтаксис

BOOL StartService(
  SC_HANDLE hService,
  DWORD dwNumServiceArgs,
  LPCTSTR* lpServiceArgVectors
);

Параметры

hService

[in] Дескриптор службы. Этот дескриптор возвращается функцией OpenService или CreateService, и он должен иметь право доступа SERVICE_START. Дополнительную информацию смотри в статье Защита службы и права доступа.

dwNumServiceArgs

[in] Число строк в массиве lpServiceArgVectors. Если lpServiceArgVectors имеет значение ПУСТО (NULL), этот параметр может быть нулем.

lpServiceArgVectors

[in] Указатель на массив указателей на строки с завершающим нулем, который передается службе как параметры. Службы драйвера не получают эти параметры. Если никакие параметры не передаются службе, этот параметр может быть значением ПУСТО (NULL). Служба обращается к этим параметрам через свою функцию ServiceMain. Первый параметр (argv [0]) - это имя службы по умолчанию, сопровождаемый параметрами, если таковые вообще имеются, в массиве lpServiceArgVectors.

Возвращаемые значения

Если функция завершается успешно, возвращаемое значение является ненулевым.

Если функция завершается ошибкой, возвращаемое значение - нуль. Чтобы получить дополнительную информацию об ошибке, вызовите GetLastError.

Следующие коды ошибки могут быть установлены диспетчером управления службами. Другие могут установиться функциями реестра, которые вызывает диспетчер управления службами.

Код возврата Описание
ERROR_ACCESS_DENIED Дескриптор не имеет права доступа SERVICE_START.
ERROR_INVALID_HANDLE Дескриптор недействителен.
ERROR_PATH_NOT_FOUND Двоичный файл службы не может быть найден.
ERROR_SERVICE_ALREADY_RUNNING Экземпляр службы уже запущен.
ERROR_SERVICE_DATABASE_LOCKED База данных блокирована.
ERROR_SERVICE_DEPENDENCY_DELETED Служба зависит от службы, которая не существует или была отмечена для удаления.
ERROR_SERVICE_DEPENDENCY_FAIL Служба зависит от другой службы, которая была не в состоянии запуститься.
ERROR_SERVICE_DISABLED Служба была заблокирована.
ERROR_SERVICE_LOGON_FAILED Служба не запустилась из-за сбоя входа в систему. Эта ошибка происходит, если служба конфигурирована так, чтобы запускаться с учетной записью, которая не имеет права "Начать работу как служба".
ERROR_SERVICE_MARKED_FOR_DELETE Служба была отмечена для удаления.
ERROR_SERVICE_NO_THREAD Поток не может быть создан для службы.
ERROR_SERVICE_REQUEST_TIMEOUT Процесс для службы был запущен, но он не вызывал функцию StartServiceCtrlDispatcher, или поток, который вызывал StartServiceCtrlDispatcher мог быть блокирован функцией обрабатывающей программы управления.

Замечания

Когда запускается сервисный драйвер, функция StartService не возвращает значение до тех пор, пока драйвер устройства не  закончит инициализацию.

Когда служба запускается, Диспетчер управления службами  (SCM), в случае необходимости, порождает процесс службы. Если указанная служба совместно использует процесс с другими службами, требуемый процесс может уже существовать. Функция StartService не ждет первого обновления состояния от новой службы, потому что это может потребовать времени. Вместо этого она возвращает значение, когда Диспетчер управления службами (SCM) получает уведомление от диспетчера управления службой, что поток ServiceMain для этой службы создан успешно.

Диспетчер управления службами (SCM) устанавливает по умолчанию следующее значение состояния перед возвращением значения из функции StartService:

Вызывающий процесс может определить, закончила ли новая служба свою инициализацию, периодически вызывая функцию QueryServiceStatus, чтобы сделать запрос о состоянии службы.

Служба не может вызвать StartService в ходе инициализации. Причина в том, что Диспетчер управления службами (SCM) в ходе инициализации блокирует базу данных управления службой, таким образом вызов StartService блокируется. Как только служба сообщает Диспетчеру управления службами (SCM), что она успешно запустилась, служба может вызвать StartService.

Как и ControlService, функция StartService будет блокироваться в течение 30 секунд, если какая-либо служба занята обработкой управляющего кода. Если занятая служба все еще не возвратилась из своего обработчика функции, когда перерыв истекает, функция StartService завершается ошибкой  ERROR_SERVICE_REQUEST_TIMEOUT. Это происходит потому, что Диспетчер управления службами (SCM) одновременно обрабатывает только одно управляющее уведомление службы.

Демонстрационный код

Пример смотри в статье Запуск службы.

Смотри также

Обзор Службы, Функции, используемые службамиControlService, CreateService, OpenService, QueryServiceStatusExServiceMain

Размещение и совместимость StartService 

К Windows XP Да 
л Windows 2000 Professional Да
и Windows NT Workstation Да
е Windows Me Нет
н Windows 98 Нет
т Windows 95 Нет
 
С Windows Server 2003 Да
е Windows 2000 Server Да
р Windows NT Server Да
в    
е    
р    
Используемая библиотека Advapi32.lib
Используемая DLL advapi32.dll
 Заголовочный файл  
- объявлено в Winsvc.h
 - включено в Windows.h
 Unicode Реализуется как StartServiceW (Unicode) и StartServiceA (ANSI)
 Замечания по платформе Не имеется

 

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

Hosted by uCoz