Аргументы командной строки Delphi Windows Services

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

Как я могу этого добиться?

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

  • ImagePath = C:\Path\to\my\service.exe -some -arguments

Спасибо

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
0
9 795
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

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

Вы, конечно, можете запустить службу с этими параметрами. Вопрос в том, как заставить установщик добавлять их в реестр.

Uwe Raabe 26.12.2008 22:25

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

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

Ответ принят как подходящий

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

Чтобы упростить задачу, я сделал следующее: я сохраняю аргументы, которые я хотел передать в переменных на моем 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;

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

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

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

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

Вы можете указать параметры для служб 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. выше.

1. Будет работать только при запуске службы из диспетчера служб, не сохраняется.

user160694 17.06.2010 15:01

Правда. Я реализовал сохранение параметров, как описано в принятом ответе выше (AfterInstall). Этот ответ был предназначен только как дополнительная информация.

nang 18.06.2010 16:16

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

Хороший замечание о разрешении, я не учел его. Что касается моей потребности, у моей службы нет приложения для настройки, и установка выполняется с параметром / install (я предполагаю, что таким образом, если у меня есть разрешение на создание ключа reg для службы, у меня также есть разрешение на редактирование вручную ключ). Это предоставленные параметры, которые я хочу сохранить. Я точно не помню, почему сейчас, но думаю, это потому, что я хотел, чтобы служба запускалась много раз с разными параметрами.

Pablo Venturino 17.06.2010 16:26

"если у меня есть разрешение на создание ключа рег". Да, проблема есть. Vista / 7 может не допускать этого, если операция не выполняется с повышенными привилегиями. Переключатель / install удобен для быстрой и грязной установки, но было бы лучше предложить пользователю правильную процедуру установки / удаления. Я написал сценарий, который будет использоваться в бесплатном инструменте установки InnoSetup для обработки служб (sandon.it/?q=node/9), других служб поддержки установщика изначально.

user160694 17.06.2010 20:46

Другие вопросы по теме