Поделиться через


Функция RegisterServiceCtrlHandlerA (winsvc.h)

Регистрирует функцию для обработки запросов управления службами.

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

Синтаксис

SERVICE_STATUS_HANDLE RegisterServiceCtrlHandlerA(
  [in] LPCSTR             lpServiceName,
  [in] LPHANDLER_FUNCTION lpHandlerProc
);

Параметры

[in] lpServiceName

Имя службы, выполняемой вызывающим потоком. Это имя службы, указанное в функции CreateService при создании службы.

Если тип службы SERVICE_WIN32_OWN_PROCESS, функция не проверяет допустимость указанного имени, так как в процессе существует только одна зарегистрированная служба.

[in] lpHandlerProc

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

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

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

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

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

Возвращаемый код Описание
ERROR_NOT_ENOUGH_MEMORY
Недостаточно памяти доступно для преобразования параметра строки ANSI в Юникод. Эта ошибка не возникает для параметров строки Юникода.
ERROR_SERVICE_NOT_IN_EXE
Запись службы была указана неправильно при вызове функции StartServiceCtrlDispat cher.

Замечания

Функция ServiceMain новой службы должна немедленно вызвать функцию RegisterServiceCtrlHandler, чтобы зарегистрировать функцию обработчика элементов управления с помощью диспетчера управления. Это позволяет диспетчеру управления вызывать указанную функцию при получении запросов на управление для этой службы. Список возможных кодов элементов управления см. вобработчика . Потоки вызывающего процесса могут использовать дескриптор состояния службы, возвращаемый этой функцией, чтобы определить службу в последующих вызовах функции SetServiceStatus.

Функция RegisterServiceCtrlHandler должна вызываться перед первым вызовом SetServiceStatus, так как RegisterServiceCtrlHandler возвращает дескриптор состояния службы для вызывающего объекта, чтобы другие службы не могли непреднамеренно задать это состояние службы. Кроме того, обработчик элементов управления должен находиться на месте, чтобы получать запросы на управление по времени, когда служба указывает элементы управления, которые он принимает через функцию SetServiceStatus.

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

Дескриптор состояния службы не должен быть закрыт.

Примеры

Пример см. в записи функции ServiceMain.

Заметка

Заголовок winsvc.h определяет RegisterServiceCtrlHandler как псевдоним, который автоматически выбирает версию ANSI или Юникод этой функции на основе определения константы препроцессора ЮНИКОДа. Сочетание использования псевдонима, нейтрального для кодирования, с кодом, не зависящим от кодирования, может привести к несоответствиям, которые приводят к ошибкам компиляции или среды выполнения. Дополнительные сведения см. в соглашениях о прототипах функций.

Требования

Требование Ценность
минимальные поддерживаемые клиентские Windows XP [только классические приложения]
минимальный поддерживаемый сервер Windows Server 2003 [только классические приложения]
целевая платформа Виндоус
заголовка winsvc.h (включая Windows.h)
библиотеки Advapi32.lib
DLL Advapi32.dll

См. также

CreateService

обработчика

RegisterServiceCtrlHandlerEx

функции обработчика управления службами

Функции службы

ServiceMain

SetServiceStatus