Функция Handler - это определяемая программой функция повторного вызова, используемая функцией RegisterServiceCtrlHandler. Сервисная программа использует ее как функцию управления обработчиком конкретного сервиса. Тип LPHANDLER_FUNCTION определяет указатель на эту функцию. Handler - это имя - заместитель для определяемого программой имени.
Эта функция была заменена управляющей обработчиком функцией HandlerEx, используемой функцией RegisterServiceCtrlHandlerEx. Сервис может использовать любое управление обработчиком, но новое управление поддерживает определяемые пользователем данные контекста и дополнительные управляющие коды.
Синтаксис
VOID WINAPI Handler( DWORD fdwControl ); |
Параметры
Управляющий код | Предназначение |
---|---|
SERVICE_CONTROL_CONTINUE | Уведомляет, что временно остановленный сервис должен возобновить работу. |
SERVICE_CONTROL_INTERROGATE | Уведомляет сервис, что он должен сообщить о информацию о его текущем состоянии диспетчеру управления сервисами (SCM). |
SERVICE_CONTROL_NETBINDADD | Уведомляет сетевой
сервис, что есть новый компонент для
соединения. Сервис должен соединиться
с новым компонентом. Однако, этот
управляющий код не рекомендуется
применять; вместо него
используйте функциональные
возможности технологии Plug and Play.
Windows NT: Это значение не поддерживается. |
SERVICE_CONTROL_NETBINDDISABLE | Уведомляет сетевой
сервис, что одна из его связей
заблокирована. Сервис должен
перечитать свою информацию о
связывании и удалить эту связь.
Однако, этот управляющий код не
рекомендуется применять; вместо
него используйте функциональные
возможности технологии Plug and Play.
Windows NT: Это значение не поддерживается. |
SERVICE_CONTROL_NETBINDENABLE | Уведомляет сетевой
сервис, что заблокированное
связывание включилось в работу.
Сервис должен перечитать свою
информацию о связывании и добавить
новое связывание. Однако, этот управляющий код не
рекомендуется применять; вместо
него используйте функциональные
возможности технологии Plug and Play.
Windows NT: Это значение значение не поддерживается. |
SERVICE_CONTROL_NETBINDREMOVE | Уведомляет сетевой
сервис, что компонент для связывания
был удален. Сервис должен перечитать
свою информацию о связывании и
освободиться от удаленного
компонента.
Однако, этот управляющий код не
рекомендуется применять; вместо
него используйте функциональные
возможности технологии Plug and Play.
Windows NT: Это значение значение не поддерживается. |
SERVICE_CONTROL_PARAMCHANGE | Уведомляет сервис,
что его параметры запуска изменились.
Сервис должен перечитать свои
параметры запуска.
Windows NT: Это значение значение не поддерживается. |
SERVICE_CONTROL_PAUSE | Уведомляет сервис, что он должен сделать паузу в работе. |
SERVICE_CONTROL_SHUTDOWN | Уведомляет сервис,
что система завершает работу, так что
сервис, может выполнить задачи
очистки.
Дополнительную информацию, см. в разделе Замечания. |
SERVICE_CONTROL_STOP | Уведомляет сервис о том, что он должен остановиться. |
Этим параметром также может быть определяемый пользователем управляющий код, как описано в таблице ниже.
Управляющий код | Предназначение |
---|---|
Диапазон от 128 до 255. | Служба определяет действие, связанное с кодом органа управления. |
Эта функция не возвращает значение.
Когда служба стартует, ее функция ServiceMain должна немедленно вызвать функцию RegisterServiceCtrlHandler, чтобы определить функцию Handler , которая обрабатывает запросы на управление.
Диспетчер управления в пределах главного потока процесса службы вызывает функцию обработки управления для указанной службы всякий раз, когда он получает запрос на управление от диспетчера управления службами. После обработки запроса на управление, обрабатывающая программа управления должна вызвать функцию SetServiceStatus, чтобы сообщить о ее текущем состоянии диспетчеру управления службами.
Когда диспетчер управления службами отправляет управляющий код службе, он ждет обработчика функции, чтобы возвратить значение перед отправкой дополнительных управляющих кодов другим службам. Если обработчик функции не возвращает значение быстро, диспетчер может заблокировать другие службы, чтобы они не получили управляющих кодов.
Управляющий код SERVICE_CONTROL_SHUTDOWN должен быть обработан только службами, которые должны безусловно очищаться в ходе закрытия, потому что имеется только ограниченное время (около 20 секунд) доступное для закрытия службы. После того, как это время истекает, система возобновляет процесс закрытия независимо от того, завершается ли закрытие службы полностью.
Обратите внимание! на то, что это, если систему оставляют в состоянии закрытия (не перезапускают или не выключают питание), служба, продолжает запускаться. |
Если служба нуждается в большем количестве времени, чтобы очистить память, она должна отправить сообщения о состоянии STOP_PENDING, наряду с указанием ожидать, таким образом диспетчер службы знает, как долго ждать перед оповещением в системе, что закрытие службы завершается полностью. Однако, чтобы воспрепятствовать службе остановить закрытие, есть предел тому, как долго диспетчер службы должен ждать. Чтобы изменять этот срок, модифицируйте значение WaitToKillServiceTimeout в следующем ключе реестра:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control |
Пример смотри в статье Запись функции обрабатывающей программы управления.
Обзор Службы, Функции, используемые службами, HandlerEx, RegisterServiceCtrlHandler, ServiceMain, SetServiceStatus
Размещение и совместимость Handler |
||
К |
Windows XP |
Да |
л |
Windows 2000 Professional |
Да |
и |
Windows NT Workstation |
Да |
е |
Windows Me |
Да |
н |
Windows 98 |
Да |
т |
Windows 95 |
Да |
С |
Windows Server 2003 |
Да |
е | Windows 2000 Server | Да |
р | Windows NT Server | Да |
в | ||
е | ||
р | ||
Используемая библиотека |
- |
|
Используемая DLL | - | |
Заголовочный файл | ||
- объявлено в |
Winsvc.h |
|
- включено в |
Windows.h |
|
Unicode |
Нет |
|
Замечания по платформе |
Не имеется |