функция обратного вызова LPHANDLER_FUNCTION_EX (winsvc.h)
Определяемая приложением функция обратного вызова, используемая с функцией RegisterServiceCtrlHandlerEx . Программа службы может использовать ее в качестве функции обработчика элемента управления определенной службы.
Тип LPHANDLER_FUNCTION_EX определяет указатель на эту функцию. HandlerEx — это заполнитель для определяемого приложением имени.
Эта функция заменяет функцию обработчика элементов управления обработчика , используемую с функцией RegisterServiceCtrlHandler . Служба может использовать любой обработчик элементов управления, но новый обработчик элементов управления поддерживает определяемые пользователем данные контекста и дополнительные расширенные коды управления.
Синтаксис
LPHANDLER_FUNCTION_EX LphandlerFunctionEx;
DWORD LphandlerFunctionEx(
[in] DWORD dwControl,
[in] DWORD dwEventType,
[in] LPVOID lpEventData,
[in] LPVOID lpContext
)
{...}
Параметры
[in] dwControl
Код элемента управления. Этот параметр может принимать одно из указанных ниже значений.
Код элемента управления | Значение |
---|---|
|
Уведомляет приостановленную службу о том, что она должна возобновиться. |
|
Уведомляет службу, чтобы сообщить о ее текущем состоянии диспетчеру управления службами.
Обработчик должен просто вернуть NO_ERROR; SCM знает о текущем состоянии службы. |
|
Уведомляет сетевую службу о наличии нового компонента для привязки. Служба должна привязаться к новому компоненту.
Вместо этого приложения должны использовать Plug and Play функциональные возможности. |
|
Уведомляет сетевую службу о том, что одна из ее привязок отключена. Служба должна перечитать сведения о привязке и удалить привязку.
Вместо этого приложения должны использовать Plug and Play функциональные возможности. |
|
Уведомляет сетевую службу о том, что отключенная привязка включена. Служба должна перечитать сведения о привязке и добавить новую привязку.
Вместо этого приложения должны использовать Plug and Play функциональные возможности. |
|
Уведомляет сетевую службу о том, что компонент для привязки был удален. Служба должна перечитать сведения о привязке и отменить привязку удаленного компонента.
Вместо этого приложения должны использовать Plug and Play функциональные возможности. |
|
Уведомляет службу о том, что параметры запуска для конкретной службы были изменены. Служба должна перечитать параметры запуска. |
|
Уведомляет службу о том, что она должна приостановить работу. |
|
Уведомляет службу о том, что система завершит работу. Службы, которым требуется дополнительное время для выполнения задач очистки за пределами жесткого ограничения времени при завершении работы системы, могут использовать это уведомление. Диспетчер управления службами отправляет это уведомление приложениям, зарегистрированным для него перед отправкой уведомления SERVICE_CONTROL_SHUTDOWN приложениям, зарегистрированным для этого уведомления.
Служба, обрабатывающая это уведомление, блокирует завершение работы системы до тех пор, пока служба не будет остановлена или не истекает интервал времени ожидания перед выходом, указанный через SERVICE_PRESHUTDOWN_INFO . Так как это влияет на взаимодействие с пользователем, службы должны использовать эту функцию только в том случае, если это абсолютно необходимо, чтобы избежать потери данных или значительного времени восстановления при следующем запуске системы. Windows Server 2003 и Windows XP: Это значение не поддерживается. |
|
Уведомляет службу о завершении работы системы, чтобы служба может выполнять задачи очистки. Обратите внимание, что службы, которые регистрируются для получения уведомлений SERVICE_CONTROL_PRESHUTDOWN , не могут получать это уведомление, так как они уже остановлены.
Если служба принимает этот код элемента управления, она должна остановиться после выполнения задач очистки и возврата NO_ERROR. После того как SCM отправит этот код элемента управления, он не будет отправлять другие коды управления в службу. Дополнительные сведения см. в разделе "Примечания" этого раздела. |
|
Уведомляет службу о том, что она должна остановиться.
Если служба принимает этот код управления, она должна остановиться после получения и возврата NO_ERROR. После того как SCM отправит этот код элемента управления, он не будет отправлять другие коды управления в службу. Windows XP: Если служба возвращает NO_ERROR и продолжает выполняться, она продолжает получать коды управления. Это поведение изменилось начиная с Windows Server 2003 и Windows XP с пакетом обновления 2 (SP2). |
Этот параметр также может быть одним из следующих кодов расширенных элементов управления. Обратите внимание, что эти коды управления не поддерживаются функцией обработчика .
Код элемента управления | Значение |
---|---|
|
Уведомляет службу событий устройства. (Служба должна быть зарегистрирована для получения этих уведомлений с помощью функции RegisterDeviceNotification .) Параметры dwEventType и lpEventData содержат дополнительные сведения. |
|
Уведомляет службу о том, что профиль оборудования компьютера изменился. Параметр dwEventType содержит дополнительные сведения. |
|
Уведомляет службу системных событий питания. Параметр dwEventType содержит дополнительные сведения. Если параметр dwEventType имеет значение PBT_POWERSETTINGCHANGE, параметр lpEventData также содержит дополнительные сведения. |
|
Уведомляет службу событий изменения сеанса. Обратите внимание, что служба будет получать уведомления о входе пользователя только в том случае, если она полностью загружена перед попыткой входа. Параметры dwEventType и lpEventData содержат дополнительные сведения. |
|
Уведомляет службу о том, что системное время изменилось. Параметр lpEventData содержит дополнительные сведения. Параметр dwEventType не используется.
Windows Server 2008, Windows Vista, Windows Server 2003 и Windows XP: Этот код элемента управления не поддерживается. |
|
Уведомляет службу, зарегистрированную для события триггера службы , о том, что произошло событие.
Windows Server 2008, Windows Vista, Windows Server 2003 и Windows XP: Этот код элемента управления не поддерживается. |
|
Уведомляет службу о том, что пользователь инициировал перезагрузку.
Windows Server 2008 R2, Windows 7, Windows Server 2008, Windows Vista, Windows Server 2003 и Windows XP: Этот код элемента управления не поддерживается. |
Этот параметр также может быть определяемым пользователем кодом элемента управления, как описано в следующей таблице.
Код элемента управления | Значение |
---|---|
|
Служба определяет действие, связанное с кодом элемента управления. |
[in] dwEventType
Тип события, которое произошло. Этот параметр используется, если dwControl имеет значение SERVICE_CONTROL_DEVICEEVENT, SERVICE_CONTROL_HARDWAREPROFILECHANGE, SERVICE_CONTROL_POWEREVENT или SERVICE_CONTROL_SESSIONCHANGE. В противном случае значение равно нулю.
Если dwControlSERVICE_CONTROL_DEVICEEVENT, этот параметр может иметь одно из следующих значений:
- DBT_DEVICEARRIVAL
- DBT_DEVICEREMOVECOMPLETE
- DBT_DEVICEQUERYREMOVE
- DBT_DEVICEQUERYREMOVEFAILED
- DBT_DEVICEREMOVEPENDING
- DBT_CUSTOMEVENT
Если dwControlSERVICE_CONTROL_SESSIONCHANGE, этот параметр может быть одним из значений, указанных в параметре wParamсообщения WM_WTSSESSION_CHANGE .
[in] lpEventData
Дополнительные сведения об устройстве, если это необходимо. Формат этих данных зависит от значения параметров dwControl и dwEventType .
Если dwControlSERVICE_CONTROL_DEVICEEVENT, эти данные соответствуют параметру lParam , который приложения получают как часть сообщения WM_DEVICECHANGE .
Если значение dwControlSERVICE_CONTROL_POWEREVENT и dwEventType PBT_POWERSETTINGCHANGE, эти данные являются указателем на структуру POWERBROADCAST_SETTING .
Если dwControlSERVICE_CONTROL_SESSIONCHANGE, этот параметр является указателем на структуру WTSSESSION_NOTIFICATION .
Если dwControlSERVICE_CONTROL_TIMECHANGE, эти данные являются указателем на структуру SERVICE_TIMECHANGE_INFO .
[in] lpContext
Определяемые пользователем данные, передаваемые из RegisterServiceCtrlHandlerEx. Если несколько служб совместно используют процесс, параметр lpContext может помочь определить службу.
Возвращаемое значение
Возвращаемое значение для этой функции зависит от полученного кода элемента управления.
В следующем списке указаны правила для этого возвращаемого значения:
- Как правило, если служба не обрабатывает элемент управления, верните ERROR_CALL_NOT_IMPLEMENTED. Однако служба должна возвращать NO_ERROR для SERVICE_CONTROL_INTERROGATE даже если служба не обрабатывает ее.
- Если служба обрабатывает SERVICE_CONTROL_STOP или SERVICE_CONTROL_SHUTDOWN, вернитесь NO_ERROR.
- Если служба обрабатывает SERVICE_CONTROL_DEVICEEVENT, верните NO_ERROR , чтобы предоставить запрос и код ошибки, чтобы отклонить запрос.
- Если служба обрабатывает SERVICE_CONTROL_HARDWAREPROFILECHANGE, верните NO_ERROR , чтобы предоставить запрос и код ошибки, чтобы отклонить запрос.
- Если служба обрабатывает SERVICE_CONTROL_POWEREVENT, верните NO_ERROR , чтобы предоставить запрос и код ошибки, чтобы отклонить запрос.
- Для всех остальных кодов управления дескрипторов службы верните NO_ERROR.
Комментарии
При запуске службы ее функция ServiceMain должна немедленно вызвать функцию RegisterServiceCtrlHandlerEx , чтобы указать функцию HandlerEx для обработки запросов управления. Чтобы указать допустимые коды элементов управления, используйте функции SetServiceStatus и RegisterDeviceNotification .
Диспетчер элементов управления в основном потоке службы вызывает функцию обработчика элемента управления для указанной службы всякий раз, когда он получает запрос на управление от диспетчера управления службой. После обработки запроса элемента управления обработчик элемента управления должен вызвать SetServiceStatus , если состояние службы изменится, чтобы сообщить о новом состоянии диспетчеру управления службой.
Функция обработчика элемента управления предназначена для получения уведомлений и немедленного возврата. Функция обратного вызова должна сохранять свои параметры и создавать другие потоки для выполнения дополнительных операций. (Приложение должно убедиться, что такие потоки завершились до остановки службы.) В частности, обработчик управления должен избегать операций, которые могут блокироваться, например, принимать блокировку, так как это может привести к взаимоблокировке или привести к прекращению реагирования системы.
Когда диспетчер управления службами отправляет в службу код элемента управления, он ожидает возврата функции обработчика перед отправкой дополнительных кодов управления другим службам. Обработчик элемента управления должен возвращать как можно скорее; Если он не возвращается в течение 30 секунд, SCM возвращает ошибку. Если служба должна выполнять длительную обработку при выполнении обработчика элемента управления, она должна создать дополнительный поток для выполнения длительной обработки, а затем вернуться из обработчика элемента управления. Это предотвращает связывание службы диспетчера элементов управления и блокирование получения кодов управления другими службами.
Код управления SERVICE_CONTROL_SHUTDOWN должен обрабатываться только службами, которые должны полностью очиститься во время завершения работы, так как для завершения работы службы доступно ограниченное время (около 20 секунд). По истечении этого времени завершение работы системы продолжается независимо от того, завершено ли завершение работы службы. Обратите внимание, что если система остается в состоянии завершения работы (не перезапущена или отключена), служба продолжает работать. Если служба регистрируется для принятия SERVICE_CONTROL_SHUTDOWN, она должна обрабатывать код элемента управления и возвращать NO_ERROR. Возврат ошибки для этого кода элемента управления и своевременного остановки может увеличить время, необходимое для завершения работы системы, так как система должна ожидать завершения работы службы до завершения работы системы.
Если службе требуется больше времени для очистки, она должна отправлять STOP_PENDING сообщения о состоянии вместе с подсказкой ожидания, поэтому контроллер службы знает, сколько времени следует ждать до завершения отправки отчетов системе о завершении работы службы. Однако для предотвращения остановки работы службы существует ограничение на время ожидания контроллера службы. Если служба завершает работу с помощью оснастки "Службы", ограничение составляет 125 секунд. Если операционная система перезагружается, ограничение времени указывается в значении WaitToKillServiceTimeout следующего раздела реестра:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control
Не забудьте обрабатывать события устройства Plug and Play как можно быстрее; в противном случае система может перестать отвечать. Если обработчик событий выполняет операцию, которая может блокировать выполнение (например, ввод-вывод), лучше всего запустить другой поток, чтобы выполнить операцию асинхронно.
Службы также могут использовать функцию SetConsoleCtrlHandler для получения уведомления о завершении работы. Это уведомление получается при завершении работы запущенных приложений, что происходит до завершения работы служб.
Требования
Минимальная версия клиента | Windows XP [только классические приложения] |
Минимальная версия сервера | Windows Server 2003 [только классические приложения] |
Целевая платформа | Windows |
Header | winsvc.h (включая Windows.h) |