15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Функция 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.