Функция ControlServiceExA (winsvc.h)
Отправляет код элемента управления в службу.
Синтаксис
BOOL ControlServiceExA(
[in] SC_HANDLE hService,
[in] DWORD dwControl,
[in] DWORD dwInfoLevel,
[in, out] PVOID pControlParams
);
Параметры
[in] hService
Дескриптор службы. Этот дескриптор возвращается функцией OpenService
[in] dwControl
Этот параметр может быть одним из следующих кодов управления.
Этот параметр также может быть определяемым пользователем кодом элемента управления, как описано в следующей таблице.
Код элемента управления | Значение |
---|---|
|
Служба определяет действие, связанное с кодом элемента управления. Дескриптор hService SERVICE_USER_DEFINED_CONTROL должен иметь право доступа к SERVICE_USER_DEFINED_CONTROL. |
[in] dwInfoLevel
Уровень информации для параметров элемента управления службой. Этот параметр должен иметь значение SERVICE_CONTROL_STATUS_REASON_INFO (1).
[in, out] pControlParams
Указатель на параметры элемента управления службой. Если dwInfoLevel SERVICE_CONTROL_STATUS_REASON_INFO, этот элемент является указателем на структуру SERVICE_CONTROL_STATUS_REASON_PARAMS.
Возвращаемое значение
Если функция выполнена успешно, возвращаемое значение ненулевое.
Если функция завершается ошибкой, возвращаемое значение равно нулю. Чтобы получить расширенные сведения об ошибке, вызовите GetLastError.
Следующие коды ошибок можно задать диспетчером управления службой. Другие коды ошибок можно задать функциями реестра, которые вызываются диспетчером управления службами.
Возвращаемый код | Описание |
---|---|
|
Дескриптор не имеет требуемого права доступа. |
|
Служба не может быть остановлена, так как другие запущенные службы зависят от нее. |
|
Указанный дескриптор не был получен с помощью CreateService или OpenService, или дескриптор больше недействителен. |
|
Запрошенный код элемента управления в параметре dwControl |
|
Запрошенный код элемента управления недопустим или неприемлем для службы. |
|
Запрошенный код элемента управления не может быть отправлен в службу, так как состояние службы SERVICE_STOPPED, SERVICE_START_PENDING или SERVICE_STOP_PENDING. |
|
Служба не запущена. |
|
Процесс службы был запущен, но он не вызывал StartServiceCtrlDispatcherили поток, вызывающий StartServiceCtrlDispatcher, может быть заблокирован в функции обработчика управления. |
|
Система завершает работу. |
Замечания
Функция ControlServiceEx запрашивает диспетчер управления службой (SCM) отправку запрошенного кода элемента управления в службу. SCM отправляет код, если служба указала, что она примет код и находится в состоянии, в котором код элемента управления можно отправить в него.
Служба SCM обрабатывает уведомления об управлении службами последовательно. Она ожидает завершения обработки уведомления об элементе управления службой перед отправкой следующего. Из-за этого вызов ControlServiceEx блоки в течение 30 секунд, если любая служба занята обработкой кода элемента управления. Если служба занята по-прежнему не возвращается из функции обработчика, когда истекает время ожидания, ControlServiceEx завершается ошибкой с ERROR_SERVICE_REQUEST_TIMEOUT.
Для остановки и запуска службы требуется дескриптор безопасности, позволяющий сделать это. Дескриптор безопасности по умолчанию позволяетучетной записи LocalSystem
Функция QueryServiceStatusEx возвращает структуру SERVICE_STATUS_PROCESS, dwCurrentState и dwControlsAccepted элементы указывают текущее состояние и элементы управления, принятые запущенной службой. Все запущенные службы принимают код элемента управления SERVICE_CONTROL_INTERROGATE по умолчанию. Драйверы не принимают коды управления, отличные от SERVICE_CONTROL_STOP и SERVICE_CONTROL_INTERROGATE. Каждая служба задает другие коды управления, которые он принимает при вызове функции SetServiceStatus, чтобы сообщить о своем состоянии. Служба всегда должна принимать эти коды при выполнении, независимо от того, что она делает.
В следующей таблице показано действие SCM в каждом из возможных состояний службы.
Состояние службы | Остановка | Другие элементы управления |
---|---|---|
ОСТАНОВЛЕННЫЙ | (c) | (c) |
STOP_PENDING | (b) | (b) |
START_PENDING | (a) | (b) |
БЕГ | (a) | (a) |
CONTINUE_PENDING | (a) | (a) |
PAUSE_PENDING | (a) | (a) |
ПРИОСТАНОВЛЕНА | (a) | (a) |
- (a)
- Если служба принимает этот код управления, отправьте запрос в службу; в противном случае ControlServiceEx возвращает ноль и GetLastError возвращает ERROR_INVALID_SERVICE_CONTROL.
- (b)
- Служба не находится в состоянии, в котором элемент управления может быть отправлен в него, поэтому ControlServiceEx возвращает ноль и GetLastError возвращает ERROR_SERVICE_CANNOT_ACCEPT_CTRL.
- (c)
- Служба не активна, поэтому ControlServiceEx возвращает ноль и возвращает GetLastError возвращает ERROR_SERVICE_NOT_ACTIVE.
Заметка
Заголовок winsvc.h определяет ControlServiceEx как псевдоним, который автоматически выбирает версию ANSI или Юникод этой функции на основе определения константы препроцессора ЮНИКОДа. Сочетание использования псевдонима, нейтрального для кодирования, с кодом, не зависящим от кодирования, может привести к несоответствиям, которые приводят к ошибкам компиляции или среды выполнения. Дополнительные сведения см. в соглашениях о прототипах функций.
Требования
Требование | Ценность |
---|---|
минимальные поддерживаемые клиентские | Windows Vista [только классические приложения] |
минимальный поддерживаемый сервер | Windows Server 2008 [только классические приложения] |
целевая платформа | Виндоус |
заголовка | winsvc.h (включая Windows.h) |
библиотеки |
Advapi32.lib |
DLL | Advapi32.dll |
См. также
SERVICE_CONTROL_STATUS_REASON_PARAMS
запросов