Delphi Windows服务命令行参数
我有一个基于Deplhi的Windows服务,它在安装时解析一些命令行参数。我希望将这些参数添加到服务命令行(注册表上的ImagePath值),以便始终使用它们启动服务 我怎样才能做到这一点 我希望regedit如下所示: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
在注册表项HKEY\U LOCAL\U MACHINE\SYSTEM\ControlSet001\Services\MyService处
ImagePath=C:\Path\to\my\service.exe-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服务的参数:
- System.ParamCount/System.ParamStr:这样可以获得3的参数。上面
- TService.ParamCount/TService.Param[]:这样可以获得1的参数。二,。上面
无论如何,我想知道,如果将命令行参数嵌入到代码中,为什么需要命令行参数?通常,这些参数是在服务之外设置的(由安装程序、配置程序等设置),以更改服务行为。您当然可以使用这些参数启动服务。问题是如何让安装程序将它们添加到注册表中。1。仅当您从服务管理器启动服务时,该服务才起作用,它不会持久化。True。我已经实现了持久化参数,如上面接受的答案(AfterInstall)中所述。这个答案只是作为额外的信息。关于许可的观点很好,没有考虑到这一点。关于我的需要,我的服务没有配置应用程序,安装是通过/install参数完成的(我想这样,如果我有权为服务创建注册表项,我也有权手动编辑注册表项)。是否提供了我要保留的参数。我现在记不清为什么了,但我想是因为我想让服务使用不同的参数运行多次,“如果我有创建注册表项的权限”。是的,问题就在那里。Vista/7可能不允许该操作,除非该操作具有提升的权限。/install(安装)开关便于快速和清洁维修安装,但最好向用户提供正确的安装/卸载程序。我编写了一个脚本,用在免费的InnoSetup安装工具中处理服务(),其他安装程序支持服务。