Способ запуска службы Delphi

#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');