10

我用 Delphi 创建了一个 Windows 服务,并使用了两种方法来安装、启动和停止。

方法一

如果我使用命令行安装此服务

C:\MyService\ServiceApp.exe /Install

它安装成功,我也可以在服务控制台中启动和停止。

方法二

但是如果我使用 sc 安装具有不同名称的相同服务,例如

C:\Windows\system32>sc create myservice binpath= c:\MyService\ServiceApp.exe

我看到它已安装,但我无法使用服务控制台以及使用

sc start myservice

当我使用 SC 进行查询时,结果如下

C:\Windows\system32>sc query myservice

SERVICE_NAME: myservice
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 2  START_PENDING
                                (NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x7d0

到目前为止,我一直在使用 /Install,但我想以不同的名称多次安装相同的服务,我从这篇文章中得到了使用的想法。(如何从指定名称和描述的命令行安装 Windows 服务?)任何人都可以解释 /Install 和 SC 之间的行为差​​异吗?

4

1 回答 1

18

您在TService实现中遇到了错误,请参阅QC #79781。如果服务名称不同于TService.Name.

TService.Name但是,您可以通过在服务启动之前进行调整来避免此限制。这样做的一个好处是TService.OnCreate事件。您需要知道服务的真实名称,因此您需要将其作为参数传递给服务 exe(将其添加到binpath命令中sc create)。

创建服务:

sc create myservice1 binpath= "c:\MyService\ServiceApp.exe myservice1"
sc create myservice2 binpath= "c:\MyService\ServiceApp.exe myservice2"

调整名称:

procedure TMyService.ServiceCreate(Sender: TObject);
begin
  if (System.ParamCount >= 1) and not CharInSet(ParamStr(1)[1], SwitchChars) then
    Name := ParamStr(1);
end;

这是一种比较基本的参数解析方法,但可以作为示例。如果第一个参数不以/or开头-,则假定它是提供的名称。

评论:

的另一个限制TService是它不能/install在命令行中创建带有参数的服务(使用 ),因为它ParamStr(0)使用binpath.

于 2013-09-03T21:52:29.020 回答