加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 服务无法启动

发布时间:2020-12-15 03:55:30 所属栏目:大数据 来源:网络整理
导读:我用Delphi创建了一个 Windows服务,并使用两种方法来安装,启动和停止. 方法1 如果我使用命令行安装此服务 C:MyServiceServiceApp.exe /Install 它安装成功,我也可以在服务控制台中启动和停止. 方法2 但如果我使用sc安装不同名称的相同服务 例如 C:Windows
我用Delphi创建了一个 Windows服务,并使用两种方法来安装,启动和停止.

方法1

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

C:MyServiceServiceApp.exe /Install

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

方法2

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

C:Windowssystem32>sc create myservice binpath= c:MyServiceServiceApp.exe

我看到它已安装但我无法使用服务控制台启动服务

sc start myservice

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

C:Windowssystem32>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之间的行为差??异吗?

解决方法

您遇到了TService实现中的错误,请参阅 QC #79781.如果服务名称与TService.Name不同,则Delphi无法启动该服务.

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

创建服务:

sc create myservice1 binpath= "c:MyServiceServiceApp.exe myservice1"
sc create myservice2 binpath= "c:MyServiceServiceApp.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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读