Windows下使用Delphi编写系统服务

      最近需要写一个Delphi的系统服务,就是要求能够在计算机启动时就可以直接运行,而不依赖于每个系统用户。查了资料,并认真实践了一下,总结如下:

      打开Delphi 7,新建,选择Other->Service Application 修改属性中Name和DisplayName,Name是Service的名称,决定着进程的标识,DisplayName是显示在操作系统里的服务面板里的服务的名称。例如我们将Name修改为NoticeService。

      新建一个类,例如名字叫做TNoticeThread,继承自TThread,并重写protected过程Execute。在NoticeService的类定义中添加一个NoticeThread对象。

      找到属性的Events选项卡,分别添加OnStart,OnPause,OnContinue,OnStop事件,用这几个事件来控制NoticeThread线程的运行:

      代码如下:

  

 1unit Unit1;
 2
 3interface
 4
 5uses
 6  Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs;
 7
 8type
 9  TNoticeThread = class(TThread)
10  private
11  protected
12    procedure Execute; override;
13  end;
14
15  TNoticeService = class(TService)
16    procedure ServiceStart(Sender: TService; var Started: Boolean);
17    procedure ServicePause(Sender: TService; var Paused: Boolean);
18    procedure ServiceContinue(Sender: TService; var Continued: Boolean);
19    procedure ServiceStop(Sender: TService; var Stopped: Boolean);
20  private
21    NoticeThread: TNoticeThread;
22    { Private declarations }
23  public
24    function GetServiceController: TServiceController; override;
25    { Public declarations }
26  end;
27
28var
29  NoticeService: TNoticeService;
30
31implementation
32
33{$R *.DFM}
34
35procedure ServiceController(CtrlCode: DWord); stdcall;
36begin
37  NoticeService.Controller(CtrlCode);
38end;
39
40function TNoticeService.GetServiceController: TServiceController;
41begin
42  Result := ServiceController;
43end;
44
45procedure TNoticeService.ServiceStart(Sender: TService; var Started: Boolean);
46begin
47  NoticeThread := TNoticeThread.Create(False);
48  Started := True;
49end;
50
51procedure TNoticeService.ServicePause(Sender: TService; var Paused: Boolean);
52begin
53  NoticeThread.Suspend;
54  Paused := True;
55end;
56
57procedure TNoticeService.ServiceContinue(Sender: TService;
58  var Continued: Boolean);
59begin
60  NoticeThread.Resume;
61  Continued := True;
62end;
63
64procedure TNoticeService.ServiceStop(Sender: TService; var Stopped: Boolean);
65begin
66  NoticeThread.Terminate;
67  Stopped := True;
68end;
69
70procedure TNoticeThread.Execute;
71begin
72  //do what the notice service will do
73end;  
74
75end.
76

 

      当然,可以将NoticeThread的定义放在另外一个Unit里即可,如果这样,只需在新建Service Application后,选择新建,Other->Thread Object即可。

      也并不一定非得用一个Thread来控制服务,只要符合需求即可。

posted on 2009-08-20 13:37  micki  阅读(3905)  评论(0编辑  收藏  举报

导航