是否可以创建TService的后代并发布我自己的属性?

时间:2012-02-12 19:34:59

标签: delphi service properties project-template

在Delphi中提供了一些不同的服务后,我意识到TService缺少服务应用程序应该带来的一些必要的东西,比如日志记录,异常处理和'描述'注册表中的财产。

我想知道我是否可以创建自己的服务shell,例如TJDService,它继承自TService,但还有一些额外的东西,例如“描述”属性显示在对象检查员。我可以像这样制作自己的服务外壳吗?我知道我可以创建自己的“默认项目”继承自TService,但包括我的所有代码和任何新项目。

创建新服务时,它应如下所示:

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes, Vcl.SvcMgr,
  JDServices;

type
  TJDService1 = class(TJDService)
  private

  public
    function GetServiceController: TServiceController; override;
  end;

var
  JDService1: TJDService1;

implementation

{$R *.DFM}

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  JDService1.Controller(CtrlCode);
end;

function TJDService1.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;

end.

与典型服务相同,但使用我的TJDService而非TService

4 个答案:

答案 0 :(得分:6)

简单的问题和一个简单的答案。是的,你可以这样做。我自己这样做是为了在我公司的代码库中实现的各种服务之间共享代码。

RegisterCustomModule是让您的Description属性显示在Object Inspector中的方法。话虽如此,我发现在Object Inspector中设置这些服务属性的能力并不是那么有价值。我认为在运行时在代码中设置它们是完全可以接受的,但是这个决定取决于个人偏好。

即使您使用RegisterCustomModule使IDE知道您的服务类,默认的新服务应用程序也不会使用您的服务类。您可以根据需要自定义默认服务应用程序,然后将其保存到Object Repository

我的回答here显示了我如何实现一个可以作为服务运行的应用程序,也可以作为标准桌面进程运行以进行调试。

答案 1 :(得分:3)

是的,您可以及以下链接了解如何操作

http://www.marcocantu.com/ddh/ddh15/ddh15e.htm

答案 2 :(得分:2)

如果您不想自己完成这项工作SvCom提供了一套很好的工具,可以在Delphi中创建服务,提供的功能远远超出现有的服务范围。

答案 3 :(得分:1)

我将成为这里的反叛者,但最简单的方法是制作自己的SvcMgr副本并在那里进行更改。只要您只进行在运行时访问的更改,使用您自己的SvcMgr本地副本构建和运行。我这样做是为了更改服务附带的基本异常处理和应用程序日志记录,您可以从我的网站下载我的SvcMgr.pas副本。

如果您需要更改设计时间,这将无效,但您在设计时所做的一切都可以在运行时完成。有更好的解决方案,但没有更快更容易。