Delphi Windows服务命令行参数

Delphi Windows服务命令行参数,delphi,windows-services,Delphi,Windows Services,我有一个基于Deplhi的Windows服务,它在安装时解析一些命令行参数。我希望将这些参数添加到服务命令行(注册表上的ImagePath值),以便始终使用它们启动服务 我怎样才能做到这一点 我希望regedit如下所示: 在注册表项HKEY\U LOCAL\U MACHINE\SYSTEM\ControlSet001\Services\MyService处 ImagePath=C:\Path\to\my\service.exe-some-arguments 谢谢 更新:安装是通过MySer

我有一个基于Deplhi的Windows服务,它在安装时解析一些命令行参数。我希望将这些参数添加到服务命令行(注册表上的ImagePath值),以便始终使用它们启动服务

我怎样才能做到这一点

我希望regedit如下所示:
在注册表项HKEY\U LOCAL\U MACHINE\SYSTEM\ControlSet001\Services\MyService处

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

更新:安装是通过MyService.exe/install-some-arguments完成的。这些参数是我希望在命令行中保留的参数


更新:我通过直接写入注册表找到了一个解决方案(请参阅),但我仍然想要一个更优雅的解决方案,比如使用一些TService属性或类似的东西。谢谢

我认为您无法使用它们启动服务,但是如果您将这些参数存储在注册表中,您可以修改程序,使其在将来启动时始终能够获取它们。(即,如果ParamCount=0,则从注册表检索params)

服务参数可以在lpBinaryPathName参数中传递给函数。在Delphi的TService中,这是在TServiceApplication.RegisterServices.InstallService中调用的,您不能(轻松地)重写它


因此,我认为最简单的方法是处理TService.AfterInstall事件,并通过自己更新注册表。

好的,经过一些研究,我放弃了一种优雅的方法,选择了直接写入注册表的直截了当的方法

为了使事情变得简单,我这样做了:我将希望传入变量的参数存储在我的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;
这不是我一直在寻找的优雅解决方案,但它确实起到了作用

谢谢你的其他答案

Pablo, 我也有同样的问题,但找不到任何东西,于是也开始编辑注册表。 此外,我还使用自定义操作创建其他安装目录和复制文件(在C#中)。 你的建议很有帮助,我也不再寻找“优雅”的方式。
谢谢

我刚刚发现了一些小惊喜,值得分享

您可以(至少)通过以下方式指定Windows服务的参数:

  • 在Service Manager GUI中将其输入为“Startparameter”
  • 将其作为参数传递给:sc.exe YourService param1 param2
  • 在注册表项ImagePath=..\YourService.exe param1 param2中输入它
  • 在Delphi中,有两种查询应用程序/服务参数的方法:

    • System.ParamCount/System.ParamStr:这样可以获得3的参数。上面
    • TService.ParamCount/TService.Param[]:这样可以获得1的参数。二,。上面

    您应该使用SCM API正确安装和配置服务。SC.EXE是SCM API的命令行接口。在这种情况下,您不应该直接操作注册表,它可以工作,但这还取决于服务帐户拥有的权限。
    无论如何,我想知道,如果将命令行参数嵌入到代码中,为什么需要命令行参数?通常,这些参数是在服务之外设置的(由安装程序、配置程序等设置),以更改服务行为。

    您当然可以使用这些参数启动服务。问题是如何让安装程序将它们添加到注册表中。1。仅当您从服务管理器启动服务时,该服务才起作用,它不会持久化。True。我已经实现了持久化参数,如上面接受的答案(AfterInstall)中所述。这个答案只是作为额外的信息。关于许可的观点很好,没有考虑到这一点。关于我的需要,我的服务没有配置应用程序,安装是通过/install参数完成的(我想这样,如果我有权为服务创建注册表项,我也有权手动编辑注册表项)。是否提供了我要保留的参数。我现在记不清为什么了,但我想是因为我想让服务使用不同的参数运行多次,“如果我有创建注册表项的权限”。是的,问题就在那里。Vista/7可能不允许该操作,除非该操作具有提升的权限。/install(安装)开关便于快速和清洁维修安装,但最好向用户提供正确的安装/卸载程序。我编写了一个脚本,用在免费的InnoSetup安装工具中处理服务(),其他安装程序支持服务。