用Delphi编写Win2000服务程序

原创 2004年08月11日 17:12:00

一、Win2000服务简介<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

服务程序(Service Application)是一种运行于WinNT的后台程序,每个服务程序(Service Application)中可能包含若干个服务(Service),每个服务就是其中的一个线程(该服务也可以创建多个子线程)。采用服务,应用程序可以获得特殊的权限,而且不会被用户通过Win2000的任务管理器直接结束程序,所以服务常常用来实现一些特殊的目标。

通过Win2000控制面板中的服务管理工具,我们可以设置/查看服务的特性:

1)服务名称;(2)显示名称;(3)描述;(4)启动类型;(5)依赖关系;

其中,服务名称是标识给服务的。

Win2000C:/WINNT/System32/services.exe程序为例子,该Exe文件对应一个Service Application,是该服务程序的可见实体;该exe中包含多个服务(Service),例如AlerterDhcpDHCP Client),Messenger等。当我们结束一个服务的时候,该服务所在的Service Application中的其他服务并没有被终止。

?????? Delphi中,Borland的工程师为我们提供了TServiceApplicationTServiceTServiceThread等类,封装了大量细节,简化了服务程序的开发。

?

二、TServiceApplication

?????? Delphi中,类TServiceApplication就对应上述的ServiceApplication。利用Delphi的开发环境,我们新建一个Service Application Project,同时就创建了一个继承自TService的类。项目文件中的Application对象就是一个TServiceApplication实例。每个TServiceApplication包含若干个TService对象,正好对应上述的服务程序和服务之间的数量关系。

通过阅读TServiceApplicationTService类的定义,可以得知,TServiceApplicationTComponent类继承而来,TService从类TDataModule基础而来,Application对象负责各个TService对象的CreateDestroy。跟踪下列代码

Application.CreateForm(TService1, Service1);

可以发现创建的TService对象的Owner都是Application对象;在VCL FrameWorkOwner总是负责Destroy各个Component对象(VCLTComponent类采用了Composite模式),所以TServiceApplication也将Destroy各个TService对象。

下面跟踪TServiceApplication.Run的代码,可以发现TServiceApplication首先解析运行参数,实现了服务的InstallUninstall。然后,初始化一个ServiceStartTable数组,该数组包含了各个service对象的服务名称和运行入口;最后创建一个TServiceStartThread 对象,该对象是一个线程对象,从线程调用APIStartServiceCtrlDispatcher来启动ServiceStartTable中指定的若干个服务;而ServiceApplication主线程就不断循环,处理消息,比如接收请求来停止/暂停某个服务。

?

三、TService

TService类继承自类 TDataModule,这意味着我们可以加入大量的VCL控件,实现丰富的功能。此外,我们还可以处理OnStartOnPauseOnStopOnContinueOnCreateOnShutDown等事件。其中需要说明的是:OnStop表示该服务被停止;而OnShutDown表示该ServiceApplication停止运行,这意味着其他服务也被终止了;两者含义是不一样的。

前面讲过,ServiceApplication通过调用StartServiceCtrlDispatcher来启动各个服务。StartServiceCtrlDispatcher启动TService的入口,该入库就是TService.MainTService.Main首先注册该服务,然后调用TService.DoStartTService.DoStart创建一个内部TServiceThread成员对象,这是一个线程对象;考察TServiceThread.Execute可以得知,当我们处理的TService1. OnExecute,那么TService会把所有的请求委托给该TServiceThread成员对象处理,该对象以默认的方式处理所有的请求。

TService. ServiceExecuteTService的主体内容。一个服务要正常运行,除了需要处理它要关注的目标(比如监听某个端口、执行某个任务等)外,还要响应外部命令/请求:比如终止、暂停、恢复该服务。因此可以考虑创建一个专门的线程来完成该任务,而在ServiceExecute中处理外面命令/请求。因此代码如下:

?????? while not Terminated do begin

?????? ?????? ServiceThread.ProcessRequests(False);

?????? end;

当然,也可以在OnExecute中处理某些任务,如监听某个端口,但是这常常会导致该Service不能及时响应Stop/Pause等请求。当OnExecute执行完了,该服务实际上就完成了任务要结束了(terminate)。

?

参考资料:

MSDN,Delphi VCL源代码,Delphi帮助文档

用Delphi编写Windows服务程序

一、Windows服务简介   服务程序(Service Application)是一种运行于WinNT的后台程序,每个服务程序(Service Application)中可能包含若干个服务(Ser...
  • xiexuan2007
  • xiexuan2007
  • 2014年01月06日 11:51
  • 1942

Delphi创建服务程序

Windows 2000/XP和2003等支持一种叫做”服务程序”的东西.程序作为服务启动有以下几个好处: 不用登陆进系统即可运行. 具有SYSTEM特权.所以你在进程管理器里面是无法结束它的. 如何...
  • wsgqp
  • wsgqp
  • 2016年07月13日 20:13
  • 2685

delphi创建具有托盘的服务程序(service)

Windows 2000/XP和2003等支持一种叫做"服务程序"的东西.程序作为服务启动有以下几个好处:     (1)不用登陆进系统即可运行.     (2)具有SYSTEM特权.所以你在进程...
  • Trassion
  • Trassion
  • 2013年08月01日 08:28
  • 4175

【转】 DELPHI编写服务程序总结三--代码质量

一、提高DELPHI程序的稳定性软件质量是一个产品的生命线,也是关乎软件开发者的幸福关键所在,每天有很多程序员都在因为软件质量而通宵达旦的加班,经常遇到的情况是刚发布的程序不停的发布补丁包。软件质量就...
  • slindesen
  • slindesen
  • 2011年01月26日 16:50
  • 728

DELPHI编写服务程序总结

DELPHI编写服务程序总结 一、服务程序和桌面程序的区别 Windows 2000/XP/2003等支持一种叫做“系统服务程序”的进程,系统服务和桌面程序的区别是: 系统服务不用登陆系统即可运...
  • zisongjia
  • zisongjia
  • 2017年05月17日 09:15
  • 530

win32 c++编写系统服务程序

首先先创建一个控制台程序,或者win32程序,都没关系。因为后台服务是看不到界面的。 服务程序应具有这样的功能: 一个服务主函数,注册服务控制句柄,启动要运行的代码。 二是服务控制函数,注册给系...
  • qq1712088151
  • qq1712088151
  • 2012年04月25日 10:21
  • 685

MinService-最简单的 Delphi 服务程序代码.7z

  • 2011年08月21日 21:08
  • 126KB
  • 下载

Delphi2010 服务程序修补 示例

  • 2012年11月24日 16:25
  • 1KB
  • 下载

delphi服务程序3范例

  • 2009年06月17日 22:13
  • 2.33MB
  • 下载

一个NT服务程序的Delphi代码

  • 2009年02月09日 17:28
  • 3KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用Delphi编写Win2000服务程序
举报原因:
原因补充:

(最多只允许输入30个字)