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线程的运行:
代码如下:
1
unit Unit1;
2
3
interface
4
5
uses
6
Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs;
7
8
type
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
28
var
29
NoticeService: TNoticeService;
30
31
implementation
32
33
{$R *.DFM}
34
35
procedure ServiceController(CtrlCode: DWord); stdcall;
36
begin
37
NoticeService.Controller(CtrlCode);
38
end;
39
40
function TNoticeService.GetServiceController: TServiceController;
41
begin
42
Result := ServiceController;
43
end;
44
45
procedure TNoticeService.ServiceStart(Sender: TService; var Started: Boolean);
46
begin
47
NoticeThread := TNoticeThread.Create(False);
48
Started := True;
49
end;
50
51
procedure TNoticeService.ServicePause(Sender: TService; var Paused: Boolean);
52
begin
53
NoticeThread.Suspend;
54
Paused := True;
55
end;
56
57
procedure TNoticeService.ServiceContinue(Sender: TService;
58
var Continued: Boolean);
59
begin
60
NoticeThread.Resume;
61
Continued := True;
62
end;
63
64
procedure TNoticeService.ServiceStop(Sender: TService; var Stopped: Boolean);
65
begin
66
NoticeThread.Terminate;
67
Stopped := True;
68
end;
69
70
procedure TNoticeThread.Execute;
71
begin
72
//do what the notice service will do
73
end;
74
75
end.
76
unit Unit1;2

3
interface4

5
uses6
Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs;7

8
type9
TNoticeThread = class(TThread)10
private11
protected12
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
private21
NoticeThread: TNoticeThread;22
{ Private declarations }23
public24
function GetServiceController: TServiceController; override;25
{ Public declarations }26
end;27

28
var29
NoticeService: TNoticeService;30

31
implementation32

33
{$R *.DFM}34

35
procedure ServiceController(CtrlCode: DWord); stdcall;36
begin37
NoticeService.Controller(CtrlCode);38
end;39

40
function TNoticeService.GetServiceController: TServiceController;41
begin42
Result := ServiceController;43
end;44

45
procedure TNoticeService.ServiceStart(Sender: TService; var Started: Boolean);46
begin47
NoticeThread := TNoticeThread.Create(False);48
Started := True;49
end;50

51
procedure TNoticeService.ServicePause(Sender: TService; var Paused: Boolean);52
begin53
NoticeThread.Suspend;54
Paused := True;55
end;56

57
procedure TNoticeService.ServiceContinue(Sender: TService;58
var Continued: Boolean);59
begin60
NoticeThread.Resume;61
Continued := True;62
end;63

64
procedure TNoticeService.ServiceStop(Sender: TService; var Stopped: Boolean);65
begin66
NoticeThread.Terminate;67
Stopped := True;68
end;69

70
procedure TNoticeThread.Execute;71
begin72
//do what the notice service will do73
end; 74

75
end.76

当然,可以将NoticeThread的定义放在另外一个Unit里即可,如果这样,只需在新建Service Application后,选择新建,Other->Thread Object即可。
也并不一定非得用一个Thread来控制服务,只要符合需求即可。
浙公网安备 33010602011771号