我使用Delphi创建了一个Windows服务,并使用了两种方法来安装,启动和停止。
方法1
如果我使用命令行安装此服务
C:\MyService\ServiceApp.exe /Install
它已成功安装,我也可以在服务控制台中启动和停止。
方法2
但如果我使用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
到目前为止我正在使用/安装,但我想用不同的名称多次安装相同的服务,我从这篇文章中得到了这个想法。 (How to install a windows service from command line specifying name and description?) 任何人都可以解释/ Install和SC之间的行为差异吗?
答案 0 :(得分:13)
您与TService
实施中的错误发生冲突,请参阅QC #79781。如果服务名称与TService.Name
不同,则Delphi无法启动该服务。
但是,您可以通过在服务启动前调整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;
这是一种有点基本的参数解析方法,但它可以作为一个例子。如果第一个参数不是以/
或-
开头,则假定它是提供的名称。
<强>注:强>
TService
的另一个限制是它无法在命令行中使用参数创建服务(使用/install
),因为它使用ParamStr(0)
作为binpath
。