Delphi Windows服务命令行参数

时间:2008-12-26 13:02:05

标签: delphi windows-services

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

我该如何做到这一点?

我希望regedit看起来像这样:
在注册表项HKEY_LOCAL_MACHINE \ SYSTEM \ ControlSet001 \ Services \ MyService

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

由于

更新:使用>MyService.exe /install -some -arguments完成安装。这些参数是我想要在命令行中保留的参数。

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

6 个答案:

答案 0 :(得分:8)

好的,经过一些研究,我放弃了一种优雅的方法,并采取了直接写入注册表的直接路径。

为了简单起见,我这样做了:我在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;

不是我想要的优雅解决方案,但是它可以胜任。

感谢您的其他答案!

答案 1 :(得分:4)

服务参数可以在lpBinaryPathName参数中传递给CreateService函数。在Delphi的TService中,这是在TServiceApplication.RegisterServices.InstallService中调用的,你不能轻易覆盖它。

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

答案 2 :(得分:2)

我发现了一些令人惊讶的东西,值得分享。

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

  1. 在Service Manager GUI中输入“Startparameter”。
  2. 将其作为参数传递给:sc.exe YourService param1 param2
  3. 在条目ImagePath = .. \ YourService.exe param1 param2
  4. 中的注册表中输入

    在Delphi中,有两种方法可以查询应用程序/服务参数:

    • System.ParamCount / System.ParamStr:这样你就得到了上面3的参数。
    • TService.ParamCount / TService.Param []:这样就可以得到上面1.和2.的参数。

答案 3 :(得分:2)

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

答案 4 :(得分:0)

我不认为你可以使用它们开始服务,但是如果你将这些参数存储在注册表中,你可以修改程序,以便将来启动时总是去抓取它们。 (即如果ParamCount = 0,则从注册表中检索params)

答案 5 :(得分:0)

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