我有一个基于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属性或类似的东西。谢谢!
答案 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服务的参数:
在Delphi中,有两种方法可以查询应用程序/服务参数:
答案 3 :(得分:2)
您应该使用SCM API正确安装服务并对其进行配置。 SC.EXE是SCM API的命令行界面。在这种情况下,您不应该直接操作注册表,它可以工作,但它还取决于服务帐户具有哪些权限。 无论如何,我想知道为什么你需要命令行参数,如果你将它们嵌入到代码中 - 通常这些参数是在服务之外设置的(通过安装程序,配置程序,等等)来改变服务行为。
答案 4 :(得分:0)
我不认为你可以使用它们开始服务,但是如果你将这些参数存储在注册表中,你可以修改程序,以便将来启动时总是去抓取它们。 (即如果ParamCount = 0,则从注册表中检索params)
答案 5 :(得分:0)
巴勃罗 我有同样的问题,找不到任何东西,也去了编辑注册表的路线。 此外,我还使用自定义操作来创建其他安装目录和复制文件(在C#中)。 你的建议很有帮助,我也不再寻找“优雅”的方式了。 感谢