我有一个用Delphi构建的服务应用程序,效果很好.它完全符合我的要求而且一切都很开心.一切都很好,直到我想在一台机器上运行该服务的两个(或更多)实例.由于服务名称被硬编码到程序中(通过服务的Name属性),我只能在任何给定的计算机上安装一次服务.如果我尝试在运行时修改Name属性,则除非将Name属性设置为在设计时设置的相同内容,否则服务不会响应.
我已经为此做了一个解决方法,我将所有代码都没有直接与服务控制管理器交互,这些代码被封装到单独的单元中.然后我为每个我想要服务的实例编写一个单独的Delphi项目,该项目具有足够的代码来启动自身并开始运行主代码.
在我看来,这种方法很丑陋,效率肯定很低.它适用于两个实例,但后来我们需要第三个和第四个……
有没有什么方法可以修改我的代码,以便我只有一个Delphi项目可以安装和运行自己作为多个服务实例与一些简单的运行时输入(例如命令行标志)?
或者也许是一个更广泛的问题:是否有“正确的方法”来实现目标?
解决方法
您还没有说清楚您在TService子类中尝试更改的内容.
你有没有添加“BeforeInstall”处理程序?
就像是:
procedure TServiceMain.ServiceLoadInfo(Sender : TObject);// new method,not an override begin Name := ParamStr(2); DisplayName := ParamStr(3); end; procedure TServiceMain.ServiceBeforeInstall(Sender: TService); begin ServiceLoadInfo(Self); end; procedure TServiceMain.ServiceCreate(Sender: TObject); begin ServiceLoadInfo(Self); end;
如果您经常这样做,请将TService子类化为在构造函数中执行此操作.
您也应该在BeforeUninstall中执行相同的操作 – 以相同的方法指向两个事件.
C:\>servicename /install MyService "My Service Description"