2012-02-12 66 views
3

在Delphi中做了一些不同的服务之后,我意识到TService缺乏一些它应该有一个服务应用程序,如日志,异常处理,并在注册表中的“描述”属性需要的东西。是否有可能让TService的后代发布我自己的属性?

我想知道是否可以制作我自己的服务外壳,例如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

+1

您正在寻找RegisterCustomModule - http://docwiki.embarcadero.com/VCL/en/DesignIntf​​.RegisterCustomModule – OnTheFly 2012-02-12 19:52:49

+0

“Embarcadero Technologies目前没有任何其他信息,请使用讨论页面帮助我们记录此主题!“并且人们想知道为什么其他人会抱怨缺少delphi文档:P – 2012-02-12 19:56:56

+1

使用designtime包中的RegisterCustomModule让Object Inspector知道服务类中的任何发布的属性,如果你不需要,那么你可以忽略RegisterCustomModule – 2012-02-12 19:58:08

回答

6

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

RegisterCustomModule是让你Description物业展了在Object Inspector的方式。话虽如此,我没有发现能够在Object Inspector中设置这些服务属性是有价值的。我认为在代码运行时将它们设置为完全可以接受,但是这个决定取决于个人偏好。

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

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

+0

我不赞成过分简化的方法,例如:TService缺乏说明支持,我们应该在第一手中解决这个问题。我们可以修复一次,然后从存储库创建我们的新服务模块,而不必担心老的Borland错误。 Re:调试方便:TService只是一个TDataModule,可以添加到任何交互式的没有任何问题的地方。 – OnTheFly 2012-02-12 21:02:46

+0

@user是的,这是从TService派生的公共基类的要点。这正是我在我的代码中所做的。增加对服务描述的支持也是我的代码的动力。我很努力地看到你不赞成的东西。 – 2012-02-12 21:09:06

+2

我不赞成“是的,我也是!”样式回答:p只有您的意见显示您的建议是保留原有解决方案。 @ kobik在这方面同意你的观点,我不这样认为。 (同时,标题写着:“发布我自己的属性”) – OnTheFly 2012-02-12 21:20:28

3

是你可以和下面就怎么做链接它

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

+0

酷,这就是我的意思是在第一个评论! – OnTheFly 2012-02-12 20:52:47

+0

伟大的文章,谢谢 – 2012-02-12 20:58:45

+2

+1。好文章。但(这只是我个人的偏好):我总是尽量避免向IDE添加额外的设计,并在运行时使用代码。我会保留Jerry发布的代码(对我来说看起来不错),并在运行时分配我的属性和方法。 – kobik 2012-02-12 21:07:34

2

如果你不想要做的工作自己SvCom提供了一个很好的工具集,用于在Delphi中创建的服务,提供远远超过开箱即用的产品。

1

我要在这里反叛,但要做到这一点最简单的方法就是让自己的SvcMgr的副本,并进行相应的修改。只要您只是在运行时进行更改,就可以使用您自己的本地副本SvcMgr进行构建和运行。我这样做是为了更改服务附带的基本异常处理和应用程序日志记录,您可以从我的网站下载我的SvcMgr.pas副本。如果你需要设计时间的变化

这是行不通的,但你在设计时做几乎所有你可以在运行时做反正。有更好的解决方案,但没有更快,更容易。

+1

当你进行delphi升级并且必须更新代码并重新实现你的mod时,这会变得很痛苦。有时你被迫使用这种方法,但当其他解决方案不可行时,它肯定应该是最后的选择。 – 2012-02-12 23:09:26

+0

并非如此 - 自德尔福7以来,我已经使用了这种方法,并且总共花费了大约15分钟时间来合并后续变更。这是一项风险管理决策 - 如果单位不太可能发生很大变化,这是最简单的方法。我们大多数人都没有时间去做任何事情,所以我的问题是为什么花费超过必要的时间来完成规范的工作? – Misha 2012-02-13 02:37:12

相关问题