У меня есть служба 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 или что-то в этом роде. Спасибо!





Я не думаю, что вы можете запустить службу с их помощью, но если вы сохраните эти параметры в реестре, вы можете изменить программу, чтобы при будущих запусках всегда идти и брать их. (т.е. если ParamCount = 0, тогда получить параметры из реестра)
Аргументы службы могут быть переданы в аргументе 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 (как минимум) следующими способами:
В Delphi есть 2 способа запросить параметры приложения / службы:
1. Будет работать только при запуске службы из диспетчера служб, не сохраняется.
Правда. Я реализовал сохранение параметров, как описано в принятом ответе выше (AfterInstall). Этот ответ был предназначен только как дополнительная информация.
Для правильной установки и настройки службы следует использовать SCM API. SC.EXE - это интерфейс командной строки для SCM API. В этой ситуации не следует манипулировать реестром напрямую, это работает, но это также зависит от того, какое разрешение имеет учетная запись службы. В любом случае, мне интересно, зачем вам нужны аргументы командной строки, если вы встраиваете их в код - обычно эти аргументы устанавливаются вне службы (установщиком, конфигуратором и т. д.) Для изменения поведения службы.
Хороший замечание о разрешении, я не учел его. Что касается моей потребности, у моей службы нет приложения для настройки, и установка выполняется с параметром / install (я предполагаю, что таким образом, если у меня есть разрешение на создание ключа reg для службы, у меня также есть разрешение на редактирование вручную ключ). Это предоставленные параметры, которые я хочу сохранить. Я точно не помню, почему сейчас, но думаю, это потому, что я хотел, чтобы служба запускалась много раз с разными параметрами.
"если у меня есть разрешение на создание ключа рег". Да, проблема есть. Vista / 7 может не допускать этого, если операция не выполняется с повышенными привилегиями. Переключатель / install удобен для быстрой и грязной установки, но было бы лучше предложить пользователю правильную процедуру установки / удаления. Я написал сценарий, который будет использоваться в бесплатном инструменте установки InnoSetup для обработки служб (sandon.it/?q=node/9), других служб поддержки установщика изначально.
Вы, конечно, можете запустить службу с этими параметрами. Вопрос в том, как заставить установщик добавлять их в реестр.