3

在 Delphi 中创建了一些不同的服务之后,我意识到TService缺少一些服务应用程序应具备的必要功能,例如日志记录、异常处理和注册表中的“描述”属性。

我想知道我是否可以制作自己的服务外壳,例如TJDService从 a 继承TService但带有一些其他内容的服务外壳,例如对象检查器中显示的“描述”属性。我可以像这样制作自己的服务外壳吗?我知道我可以让我自己的“默认项目”继承自 a 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.

与典型服务相同,但使用 myTJDService而不是TService.

4

4 回答 4

6

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

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

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

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

于 2012-02-12T19:46:06.273 回答
3

是的,您可以在下面的链接中了解如何操作

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

于 2012-02-12T20:48:02.243 回答
2

如果您不想自己做这项工作,SvCom提供了一套很好的工具,用于在 Delphi 中创建服务,这些工具提供的功能远远超出了开箱即用的功能。

于 2012-02-12T22:47:09.990 回答
1

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

如果您需要在设计时进行更改,这将不起作用,但是您在设计时所做的几乎所有事情都可以在运行时进行。有更好的解决方案,但没有一个更快更容易。

于 2012-02-12T22:54:04.070 回答