#c #windows #winapi #windows-services
#c #Windows #winapi #windows-службы
Вопрос:
Я работаю над простой службой NT с приложением, которое будет отслеживать ее и отображать состояние в панели задач. При запуске монитор проверяет, запущена ли служба, и предлагает запустить ее, если это не так. Это нормально до перезагрузки, когда монитор запускается перед службой и запрашивает ее запуск, даже если она запустится автоматически.
Прочитав документы, я подумал, что статус будет сообщаться как SERVICE_START_PENDING
что является первым, что делает служба при входе в основную функцию службы, однако, похоже, что статус сообщается как SERVICE_STOPPED
, если SCM не начал запускать службу. Есть ли какой-либо способ определить, что служба начнет запускаться в ближайшее время?
Спасибо, J
Ответ №1:
Я не думаю, что есть какой-либо способ предсказать, что диспетчер управления службами будет делать в будущем. Однако я могу придумать пару вещей, которые могли бы смягчить вашу ситуацию:
-
Периодически следите за состоянием службы, и когда она перейдет в режим «запуск», соответствующим образом обновите статус вашего значка
-
Проверьте параметр автозапуска процесса, и если он установлен на автоматический, а ваша программа мониторинга только что запустилась, то отложите сообщение о том, что служба не запущена (в предположении, что она, вероятно, скоро запустится).
Комментарии:
1. Спасибо, это то, что я понял, но подумал, что, возможно, я что-то упускаю. периодическая проверка, похоже, является правильным решением.
2. Это правильно, SCM просто отражает обновления статуса, которые ему предоставляет служба при
SetServiceStatus
обратном вызове. Таким образом, если процесс обслуживания еще даже не запущен, состояние будет отображаться какStopped
.
Ответ №2:
Вероятно, вам нужны оба QueryServiceConfig
и QueryServiceConfig2()
. Для получения SERVICE_CONFIG_DELAYED_AUTO_START_INFO
данных необходим второй вызов.