首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >服务未启动

问服务未启动
EN

Stack Overflow用户
提问于 2013-09-03 18:33:49
回答 1查看 2.5K关注 0票数 10

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

方法1

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

代码语言:javascript
复制
C:\MyService\ServiceApp.exe /Install

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

方法2

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

代码语言:javascript
复制
C:\Windows\system32>sc create myservice binpath= c:\MyService\ServiceApp.exe

我看到它已经安装了,但是我不能使用服务控制台以及

代码语言:javascript
复制
sc start myservice

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

代码语言:javascript
复制
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,但是我想用不同的名称多次安装相同的服务,我从这篇文章中得到了使用的想法。(How to install a windows service from command line specifying name and description?)有人能解释/Install和SC之间的行为差异吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-03 21:52:29

您与TService实现中的一个bug发生了冲突,请参阅QC #79781。如果服务名称与TService.Name不同,则Delphi无法启动服务。

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

创建服务:

代码语言:javascript
复制
sc create myservice1 binpath= "c:\MyService\ServiceApp.exe myservice1"
sc create myservice2 binpath= "c:\MyService\ServiceApp.exe myservice2"

调整名称:

代码语言:javascript
复制
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。

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18599201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档