Аргументы командной строки Delphi Windows Services - PullRequest
6 голосов
/ 26 декабря 2008

У меня есть служба Windows на базе Deplhi, которая при установке анализирует некоторые аргументы командной строки. Я хочу, чтобы эти аргументы были добавлены в командную строку служб (значение ImagePath в реестре), чтобы служба всегда запускалась с ними.

Как мне это сделать?

Я хочу, чтобы regedit выглядело так:
в разделе реестра HKEY_LOCAL_MACHINE \ SYSTEM \ ControlSet001 \ Services \ MyService

  • ImagePath = C:\Path\to\my\service.exe <strong>-some -arguments</strong>

Спасибо

Обновление: установка выполняется с >MyService.exe /install -some -arguments. Это те аргументы, которые я хочу сохранить в командной строке.

Обновление: я нашел решение, написав непосредственно в реестр (см. здесь ), но я все же хотел бы более элегантное решение, например, использование некоторого свойства TService или чего-то в этом роде. Спасибо!

Ответы [ 6 ]

8 голосов
/ 27 декабря 2008

Хорошо, после некоторого исследования я отказался от элегантного подхода и выбрал прямой путь записи непосредственно в реестр.

Чтобы упростить задачу, я сделал это: я храню аргументы, которые я хотел передать, в переменных TService. Затем я установил событие AfterInstall для записи непосредственно в реестр (используя объект TRegistry) нужной мне командной строки.

uses Registry;
procedure MyService.AfterInstall(Sender: TObject) ;
var
  reg:TRegistry;
begin
  reg := TRegistry.Create;
  try
    reg.RootKey := 'HKEY_LOCAL_MACHINE';
    if reg.OpenKey('SYSTEM\CurrentControlSet\Services\MyService', True) then
    begin
      reg.WriteExtendString ('ImagePath', ParamStr(0) + ' -some -arguments') ;
      reg.CloseKey;
    end;
  finally
    reg.Free;
  end;
end;

Не то элегантное решение, которое я искал, но оно делает свою работу.

Спасибо за другие ответы через!

4 голосов
/ 27 декабря 2008

Аргументы службы могут быть переданы в аргументе lpBinaryPathName в функцию CreateService . В Delphi TService это вызывается внутри TServiceApplication.RegisterServices.InstallService, который нельзя переопределить (легко).

Поэтому я подозреваю, что самый простой способ сделать это - обработать событие TService.AfterInstall и обновить реестр самостоятельно с помощью ChangeServiceConfig .

2 голосов
/ 17 июня 2010

Вам следует использовать SCM API, чтобы правильно установить сервис и настроить его. SC.EXE - это интерфейс командной строки к SCM API. Вы не должны манипулировать реестром напрямую в этой ситуации, он работает, но это также зависит от того, какое разрешение имеет учетная запись службы. В любом случае мне интересно, зачем вам нужны аргументы командной строки, если вы встраиваете их в код - обычно эти аргументы устанавливаются вне службы (установщиком, конфигуратором и т. Д.) Для изменения поведения службы.

2 голосов
/ 17 июня 2010

Я только что обнаружил кое-что немного удивительное, может быть стоит поделиться.

Вы можете указать параметры для служб Windows (как минимум) следующими способами:

  1. Введите его в графическом пользовательском интерфейсе Service Manager как «Параметр запуска».
  2. Передайте его в качестве аргументов: sc.exe YourService param1 param2
  3. Введите его в реестр в записи ImagePath = .. \ YourService.exe param1 param2

В Delphi есть 2 способа запроса параметров приложения / службы:

  • System.ParamCount / System.ParamStr: Таким образом, вы получаете параметры 3. выше.
  • TService.ParamCount / TService.Param []: Таким образом, вы получаете параметры 1. и 2. выше.
0 голосов
/ 28 января 2009

Пабло, У меня был тот же вопрос, и я ничего не смог найти, и пошел по пути редактирования реестра. Кроме того, я использую Custom Actions также для создания дополнительных каталогов установки и копирования файлов (в C #). Ваше предложение было полезным, и я перестал искать "элегантный" способ. спасибо

0 голосов
/ 26 декабря 2008

Я не думаю, что вы можете заставить службу запускаться с ними, но если вы сохраните эти параметры в реестре, вы можете изменить программу, чтобы при будущих запусках всегда заходить и брать их. (т.е. если ParamCount = 0, тогда получить параметры из реестра)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...