#delphi #service
Вопрос:
У меня есть приложение службы Windows, написанное на Delphi XE5 с StartType
установленным значением stAuto
. Есть ли способ для службы определить, запускается ли она автоматически при загрузке или запускается вручную? У меня есть отдельная программа-менеджер, которая выполняет установку, запуск, остановку и удаление. Службе необходимо знать, исходил ли запуск от менеджера. Я мог бы попросить менеджера внести запись в реестр непосредственно перед ручным запуском и использовать ее в качестве теста, но мне было интересно, есть ли более чистое решение.
Комментарии:
1. » загрузочные стихи »
Способ изгнать службы.
2. Дох! Хороший улов.
Ответ №1:
У меня есть приложение службы Windows, написанное на Delphi XE5, с типом StartType, установленным в stAuto. Есть ли способ для службы определить, запускается ли она автоматически при загрузке или запускается вручную?
Не совсем так, нет. Начало-это начало, независимо от того, когда оно выпущено. Однако…
У меня есть отдельная программа-менеджер, которая выполняет установку, запуск, остановку и удаление. Службе необходимо знать, исходил ли запуск от менеджера.
Менеджер может включать дополнительный параметр при вызове StartService()
. Затем служба может перечислить свое Param[]
свойство при запуске, ища этот параметр.
Я мог бы попросить менеджера внести запись в реестр непосредственно перед ручным запуском и использовать ее в качестве теста, но мне было интересно, есть ли более чистое решение.
Да, есть — используя lpServiceArgVectors
параметр StartService()
:
dwNumServiceArgs
Количество строк в
lpServiceArgVectors
массиве. ЕслиlpServiceArgVectors
значение равно НУЛЮ, этот параметр может быть равен нулю.
lpServiceArgVectors
Строки, заканчивающиеся нулем, которые должны быть переданы
ServiceMain
функции для службы в качестве аргументов. Если аргументов нет, этот параметр может быть равен НУЛЮ. В противном случае первым аргументом (lpServiceArgVectors[0]
) является имя службы, за которым следуют любые дополнительные аргументы (lpServiceArgVectors[1]
черезlpServiceArgVectors[dwNumServiceArgs-1]
).
Ответ №2:
Заставил его работать, используя информацию Реми. Моя программа-менеджер отправляет параметр, указывающий на запуск вручную:
arg := 'ManualStart'; // arg: PChar;
StartService(SvcSCH, 1, arg);
Затем моя служебная программа проверяет параметры в событии OnStart:
// Param[0] is always set to service name
// Param[1] will not exist if autostart from bootup
ManualStart := (ParamCount > 1) and (Param[1] = 'ManualStart');