Функция StartService.
Функция StartService запускает сервис.
BOOL StartService(
SC_HANDLE hService,
DWORD dwNumServiceArgs,
LPCTSTR* lpServiceArgVectors
);
Параметры
- hService
- Дескриптор сервиса. Этот дескриптор возвращают
функции OpenService
или CreateService и он должен
иметь режим доступа SERVICE_START. Более подробно см. Безопасность
сервисов и права доступа.
- dwNumServiceArgs
- Количество строк в массиве lpServiceArgVectors. Если lpServiceArgVectors
равен NULL, то этот параметр может быть нулевым.
- lpServiceArgVectors
- Указатель на массив указателей на строки
(завершающиеся нулём), которые будут переданы в
сервис как аргументы. Сервисы драйверов не
получают этих аргументов. Если сервису не
передаются никакие параметры, то этот параметр
можно задать как NULL. Сервис получает доступ к
этим аргументам через свою функцию ServiceMain.
Первый аргумент (argv[0]), это имя сервиса.
Возвращаемое значение
В случае успеха, функция возвращает ненулевое
значение.
В случае ошибки, функция вернёт ноль. Для
получения более подробной информации об ошибке,
можно воспользоваться функцией GetLastError.
В таблице представлены стандартные коды
ошибок:
Значение |
Описание |
ERROR_ACCESS_DENIED |
Дескриптор не имеет прав на запуск
сервиса. |
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 |
Эта ошибка появляется, если сервис был
запущен и аккаунта, который не имеет прав "Log on
as a service". |
ERROR_SERVICE_MARKED_FOR_DELETE |
Сервис был помечен на удаление. |
ERROR_SERVICE_NO_THREAD |
Не удаётся создать поток для сервиса. |
ERROR_SERVICE_REQUEST_TIMEOUT |
Процесс для сервиса был создан, но он не
вызвал функцию StartServiceCtrlDispatcher,
или поток, который вызвал StartServiceCtrlDispatcher
мог быть быть блокирован в функции обработчика. |
Замечания
При запуске сервисов драйверов, функция StartService
не вернёт управление до тех пор, пока драйвер
устройства не закончит инициализацию.
Перед тем, как вернуть управление из StartService,
менеджер управления сервисами устанавливает
следующие значения состояния сервиса:
- Текущее состояние сервиса SERVICE_START_PENDING.
- Controls accepted is set to none (zero).
- Значение CheckPoint устанавливается в ноль.
- Время WaitHint устанавливается в 2 секунды.
Чтобы контролировать процесс запуска сервиса,
можно периодически вызывать функцию QueryServiceStatus.
В процессе инициализации, сервис не может
вызывать StartService, так как на время
инициализации сервиса, менеджер блокирует базу
данных.
Пример
См. Запуск сервиса.
Дополнительная информация
Windows NT/2000/XP: Присутствует начиная с Windows NT 3.1 и
выше.
Unicode: Существует как Unicode, так и ANSI версии.
Заголовок: Объявлена в Winsvc.h; включена в Windows.h.
Библиотека: Advapi32.lib.
|