Функция StartService запускает службу.
Синтаксис
BOOL StartService( SC_HANDLE hService, DWORD dwNumServiceArgs, LPCTSTR* lpServiceArgVectors ); |
[in] Дескриптор службы. Этот дескриптор возвращается функцией OpenService или CreateService, и он должен иметь право доступа SERVICE_START. Дополнительную информацию смотри в статье Защита службы и права доступа.
[in] Число строк в массиве lpServiceArgVectors. Если lpServiceArgVectors имеет значение ПУСТО (NULL), этот параметр может быть нулем.
[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, QueryServiceStatusEx, ServiceMain
Размещение и совместимость 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) | |
Замечания по платформе | Не имеется |