用Delphi编写Win2000服务程序

摘要:本文介绍用Delphi编写Win2000服务程序,所涉及到的类是TServiceApplicatoin,TService,TServiceThread等。 关键字:
Service/服务 一、Win2000服务简介服务程序(Service Application)是一种运行于WinNT的后台程序,每个服务程序(Service
Application)中可能包含若干个服务(Service),每个服务就是其中的一个线程(该服务也可以创建多个子线程)。采用服务,应用
程序可以获得特殊的权限,而且不会被用户通过Win2000的任务管理器直接结束程序,所以服务常常用来实现一些特殊的目标。通过
Win2000控制面板中的服务管理工具,我们可以设置/查看服务的特性:(1)服务名称;(2)显示名称;(3)描述;(4)启动类型;
(5)依赖关系;其中,服务名称是标识给服务的。以Win2000的C:/WINNT/System32/services.exe程序为例子,该Exe文件对应一个
Service Application,是该服务程序的可见实体;该exe中包含多个服务(Service),例如Alerter,Dhcp(DHCP Client),
Messenger等。当我们结束一个服务的时候,该服务所在的Service Application中的其他服务并没有被终止。 在Delphi中,
Borland的工程师为我们提供了TServiceApplication,TService,TServiceThread等类,封装了大量细节,简化了服务程序的开发。
二、TServiceApplication 在Delphi中,类TServiceApplication就对应上述的ServiceApplication。利用Delphi的开发环境,我
们新建一个Service Application Project,同时就创建了一个继承自TService的类。项目文件中的Application对象就是一个
TServiceApplication实例。每个TServiceApplication包含若干个TService对象,正好对应上述的服务程序和服务之间的数量关系。通
过阅读TServiceApplication和TService类的定义,可以得知,TServiceApplication从TComponent类继承而来,TService从类
TDataModule基础而来,Application对象负责各个TService对象的Create和Destroy。跟踪下列代码Application.CreateForm
(TService1, Service1);可以发现创建的TService对象的Owner都是Application对象;在VCL FrameWork中Owner总是负责Destroy各个
Component对象(VCL的TComponent类采用了Composite模式),所以TServiceApplication也将Destroy各个TService对象。下面跟踪
TServiceApplication.Run的代码,可以发现TServiceApplication首先解析运行参数,实现了服务的Install和Uninstall。然后,初始
化一个ServiceStartTable数组,该数组包含了各个service对象的服务名称和运行入口;最后创建一个TServiceStartThread 对象,该
对象是一个线程对象,从线程调用API:StartServiceCtrlDispatcher来启动ServiceStartTable中指定的若干个服务;而
ServiceApplication主线程就不断循环,处理消息,比如接收请求来停止/暂停某个服务。 三、TServiceTService类继承自类
TDataModule,这意味着我们可以加入大量的VCL控件,实现丰富的功能。此外,我们还可以处理OnStart,OnPause,OnStop,
OnContinue,OnCreate,OnShutDown等事件。其中需要说明的是:OnStop表示该服务被停止;而OnShutDown表示该ServiceApplication
停止运行,这意味着其他服务也被终止了;两者含义是不一样的。前面讲过,ServiceApplication通过调用
StartServiceCtrlDispatcher来启动各个服务。StartServiceCtrlDispatcher启动TService的入口,该入库就是
TService.Main。TService.Main首先注册该服务,然后调用TService.DoStart。TService.DoStart创建一个内部TServiceThread成员对
象,这是一个线程对象;考察TServiceThread.Execute可以得知,当我们处理的TService1. OnExecute,那么TService会把所有的请求
委托给该TServiceThread成员对象处理,该对象以默认的方式处理所有的请求。TService. ServiceExecute是TService的主体内容。一
个服务要正常运行,除了需要处理它要关注的目标(比如监听某个端口、执行某个任务等)外,还要响应外部命令/请求:比如终止、暂
停、恢复该服务。因此可以考虑创建一个专门的线程来完成该任务,而在ServiceExecute中处理外面命令/请求。因此代码如下:
while not Terminated do beginServiceThread.ProcessRequests(False); end;当然,也可以在OnExecute中处
理某些任务,如监听某个端口,但是这常常会导致该Service不能及时响应Stop/Pause等请求。当OnExecute执行完了,该服务实际上就
完成了任务要结束了(terminate)。 参考资料:MSDN,Delphi VCL源代码,Delphi帮助文档 

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值