Delphi Windows服务名称与项目名称冲突
我有一个名为DataCapture.dpr的基本文件Delphi Windows服务名称与项目名称冲突,delphi,windows-services,Delphi,Windows Services,我有一个名为DataCapture.dpr的基本文件 program DataCapture; 里面 然后,我必须为服务本身赋予另一个名称,以避免名称冲突: TDataCaptureService = class(TService) 现在,当我注册它时,服务将在“DataCaptureService”注册表项下注册,但我想要: 要在“DataCapture”注册表项下注册它 保留DataCapture.exe文件名的步骤 要保留DataCapture.dpr文件名 如何实现这一点?你不能实现
program DataCapture;
里面
然后,我必须为服务本身赋予另一个名称,以避免名称冲突:
TDataCaptureService = class(TService)
现在,当我注册它时,服务将在“DataCaptureService”注册表项下注册,但我想要:
如何实现这一点?你不能实现你所有的三个愿望——你必须牺牲一些东西。在这种情况下,请将项目名称更改为其他名称,然后在生成后将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