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

Delphi Windows service name conflict with project name

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

program DataCapture;

里面。

然后我不得不给服务本身起另一个名字以避免名称冲突:

TDataCaptureService = class(TService)

现在,当我注册它时,服务会在 "DataCaptureService" 注册表项下注册,但我想要:

  1. 在 "DataCapture" 注册表项下注册它
  2. 保留DataCapture.exe文件名
  3. 保留DataCapture.dpr文件名

如何实现?

您无法实现所有三个愿望 - 您必须牺牲一些东西。在这种情况下,将您的项目名称更改为其他名称,然后 post-build,将 EXE 名称更改为您想要的名称。 Delphi 编译器根本不允许相同的标识符被使用两次。


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

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

Name := 'DataCapture';

或者,最重要的是,重写 DoCreate 方法,因为 OnCreate 用于外部事物:

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