Delphi Windows服务名称与项目名称冲突

Delphi Windows服务名称与项目名称冲突,delphi,windows-services,Delphi,Windows Services,我有一个名为DataCapture.dpr的基本文件 program DataCapture; 里面 然后,我必须为服务本身赋予另一个名称,以避免名称冲突: TDataCaptureService = class(TService) 现在,当我注册它时,服务将在“DataCaptureService”注册表项下注册,但我想要: 要在“DataCapture”注册表项下注册它 保留DataCapture.exe文件名的步骤 要保留DataCapture.dpr文件名 如何实现这一点?你不能实现

我有一个名为DataCapture.dpr的基本文件

program DataCapture;
里面

然后,我必须为服务本身赋予另一个名称,以避免名称冲突:

TDataCaptureService = class(TService)
现在,当我注册它时,服务将在“DataCaptureService”注册表项下注册,但我想要:

  • 要在“DataCapture”注册表项下注册它
  • 保留DataCapture.exe文件名的步骤
  • 要保留DataCapture.dpr文件名

  • 如何实现这一点?

    你不能实现你所有的三个愿望——你必须牺牲一些东西。在这种情况下,请将项目名称更改为其他名称,然后在生成后将EXE名称更改为所需名称。Delphi编译器不允许使用同一标识符两次



    还有一种选择。默认情况下,从Delphi编译的服务有自己的
    /install
    /uninstall
    参数,您可以调用这些参数,这些参数在内部使用服务的
    名称。但是,您可以忽略这一点,并使用您想要的任何名称通过WinAPI在外部安装它(从而为您的新名称生成相应的注册表项)

    你不能实现你所有的三个愿望——你必须牺牲一些东西。在这种情况下,请将项目名称更改为其他名称,然后在生成后将EXE名称更改为所需名称。Delphi编译器不允许使用同一标识符两次



    还有一种选择。默认情况下,从Delphi编译的服务有自己的
    /install
    /uninstall
    参数,您可以调用这些参数,这些参数在内部使用服务的
    名称。但是,您可以忽略这一点,并使用您想要的任何名称通过WinAPI在外部安装它(从而为您的新名称生成相应的注册表项)

    命名冲突预防仅由IDE在设计时强制实施。为了避免这种情况,您只需在运行时设置服务名称,例如在
    OnCreate
    事件中:

    Name := 'DataCapture';
    
    或者,最好的方法是重写
    DoCreate
    方法,因为
    OnCreate
    用于外部事物:

    procedure TDataCaptureService.DoCreate();
    begin
      Name := 'DataCapture';
      inherited;
    end;
    

    命名冲突预防仅由IDE在设计时强制实施。为了避免这种情况,您只需在运行时设置服务名称,例如在
    OnCreate
    事件中:

    Name := 'DataCapture';
    
    或者,最好的方法是重写
    DoCreate
    方法,因为
    OnCreate
    用于外部事物:

    procedure TDataCaptureService.DoCreate();
    begin
      Name := 'DataCapture';
      inherited;
    end;
    

    顺便说一下,您不应该关心它在哪个注册表项下。那只适用于Windows。我怀疑您在应用程序中硬编码了此注册表项,这就是您不想更改它的原因。请不要在设计时尝试将服务名称更改为“DataCapture”-我认为IDE会抱怨命名与项目名称冲突-但在运行时,在
    OnCreate
    事件处理程序中:
    Name:=“DataCapture”I'v试图更改构造函数中的名称。它没有任何效果。当服务组件从dfm流初始化时,您在构造函数中设置的内容可能会被覆盖
    OnCreate
    可能是一个更好的地方。顺便说一句,你不应该在意它在哪个注册表项下。那只适用于Windows。我怀疑您在应用程序中硬编码了此注册表项,这就是您不想更改它的原因。请不要在设计时尝试将服务名称更改为“DataCapture”-我认为IDE会抱怨命名与项目名称冲突-但在运行时,在
    OnCreate
    事件处理程序中:
    Name:=“DataCapture”I'v试图更改构造函数中的名称。它没有任何效果。当服务组件从dfm流初始化时,您在构造函数中设置的内容可能会被覆盖
    OnCreate
    可能是一个更好的地方。谢谢Jerry,但是注册表项名称会影响我如何从命令行使用
    net start
    启动它。@Paul不,它不会-启动/停止时,服务的“名称”才是最重要的。安装服务时,Windows恰好使用服务的名称作为注册表项。只有在您选择在安装时编写服务的
    说明
    时,才应该关心此注册表项。没有其他内容。即使如此,您也不应该直接将说明写入注册表,您应该使用
    ChangeServiceConfig2()
    ,而将
    dwInfoLevel
    设置为
    SERVICE\u CONFIG\u description
    谢谢Jerry,但是注册表项名称会影响我如何从命令行开始使用
    net start
    。@Paul不,它不会-启动/停止时,服务的“名称”才是最重要的。安装服务时,Windows恰好使用服务的名称作为注册表项。只有在您选择在安装时编写服务的
    说明
    时,才应该关心此注册表项。没有其他内容。即使如此,您也不应该直接将说明写入注册表,您应该使用
    ChangeServiceConfig2()
    来代替
    dwInfoLevel
    设置为
    SERVICE\u CONFIG\u description