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


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

Всякий раз, когда вызывается функция HandlerEx, служба должна вызвать и функцию SetServiceStatus, чтобы сообщить о своем состоянии  Диспетчеру управления службами (SCM). Это должно быть сделано независимо от того, изменилось ли состояние.

Сервисная программа управления может отправлять запросы на управление, используя функцию ControlService. Все службы должны принимать и обрабатывать управляющий код  SERVICE_CONTROL_INTERROGATE. Вы можете разрешить или запретить принятие других управляющих кодов, путем вызова функции SetServiceStatus. Чтобы получить управляющий код SERVICE_CONTROL_DEVICEEVENT, Вы должны вызвать функцию RegisterDeviceNotification. Службы могут обработать также и дополнительные определенные пользователем управляющие коды.

Обработчик управления должен возвратить  значение в течение 30 секунд, или же Диспетчер управления службами (SCM) возвращает ошибку. Если служба должна делать обработку данных дальше, когда служба исполняется обработчиком управления, она должна создать вторичный поток, чтобы выполнить дальнейшую обработку, а затем возвратить значение. Это препятствует службе мешать диспетчеру управления. Например, обрабатывая запрос об остановке службы, которая отнимает много времени, создайте другой поток, чтобы обработать процесс остановки. Обработчик управления должен просто вызвать функцию SetServiceStatus с сообщением SERVICE_STOP_PENDING и возвращаемым значением.

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

Обратите внимание! на то, что, если систему оставляют в состоянии завершения работы (она не перезапускается или не выключается питание), служба остается запущенной.

Если служба нуждается в большем количестве времени, чтобы произвести процедуры очистки, она отправляет сообщения о состоянии STOP_PENDING, наряду с указанием ожидать, таким образом диспетчер службы знает, как долго ждать сообщение в систему, что закрытие службы  завершилось полностью. Однако, чтобы воспрепятствовать службе остановить закрытие, есть ограничение тому, как долго может ждать диспетчер службы. Чтобы изменить это ограничение времени, измените значение WaitToKillServiceTimeout в следующем ключе реестра:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control

Клиенты требуют быстрого закрытия операционной системы. Например, если компьютер, работает с электропитанием от источника бесперебойного питания (UPS) и он не может завершить закрытие быстрее, чем источник бесперебойного питания (UPS) отключит  электрический ток, то данные могут быть потеряны. Поэтому, службы должны завершить свои задачи очистки как можно быстрее. Хороший способ минимизировать потери данных - это сохранение данных на постоянной основе,  отслеживание данных, которые сохраняются на диске, но только исключая ваши не сохраненные данные при закрытии системы.    Когда компьютер закрывается, не тратьте время, освобождая распределенную память или другие системные ресурсы. Если Вы должны уведомить сервер, что выходите из системы, минимизируете затрачиваемое время ожидания ответа, потому что сетевые задачи могут задержать закрытие вашей службы.

Обратите внимание! на то, что в ходе закрытия службы, Диспетчер управления службами (SCM) не принимает во внимание зависимости. SCM перечисляет список запущенных служб и отправляет команду SERVICE_CONTROL_SHUTDOWN. Поэтому, служба может завершиться ошибкой, потому что другая служба, от которой она зависит, уже остановилась. Чтобы установить очередность отключения зависимых служб, используйте функцию SetProcessShutdownParameters. Диспетчер управления службами (SCM) использует эту функцию, чтобы дать своему обработчику приоритет 0x1E0; SCM отправляет уведомления SERVICE_CONTROL_SHUTDOWN, когда вызывается его обрабатывающая программа управления и ждет службы, чтобы выйти из программы перед возвращением значения из его обрабатывающей программы управления.

Дополнительную информацию смотри в статье Запись функции обрабатывающей программы управления.

Назад в оглавление
На главную страницу

Hosted by uCoz