Delphi Windows 服务名称与项目名称冲突
Delphi Windows service name conflict with project name
我有一个名为 DataCapture.dpr 的基本文件
program DataCapture;
里面。
然后我不得不给服务本身起另一个名字以避免名称冲突:
TDataCaptureService = class(TService)
现在,当我注册它时,服务会在 "DataCaptureService" 注册表项下注册,但我想要:
- 在 "DataCapture" 注册表项下注册它
- 保留DataCapture.exe文件名
- 保留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;
我有一个名为 DataCapture.dpr 的基本文件
program DataCapture;
里面。
然后我不得不给服务本身起另一个名字以避免名称冲突:
TDataCaptureService = class(TService)
现在,当我注册它时,服务会在 "DataCaptureService" 注册表项下注册,但我想要:
- 在 "DataCapture" 注册表项下注册它
- 保留DataCapture.exe文件名
- 保留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;