Windows 2000/XP和2003等支持一种叫做”服务程序”的东西.程序作为服务启动有以下几个好处:
不用登陆进系统即可运行.
具有SYSTEM特权.所以你在进程管理器里面是无法结束它的.
如何创建Service
下面就介绍一下如何用Delphi7创建一个Service程序:
运行Delphi7,选择菜单File–>New–>Other—>Service Application.将生成一个服务程序的框架.将工程保存为ServiceDemo.dpr和Unit_Main.pas,然后回到主框架.我们注意到,Service有几个属性.其中以下几个是我们比较常用的:
- DisplayName:服务的显示名称
- Name:服务名称.
如下图所示,Service的属性Name和DisplayName分别对应服务的服务名称和显示名称
Service事件:
创建完代码后我们就可以在Service服务的各个事件里面编写相关代码实现我们的功能了,一般在代码中我们都会实现以下几个事件方法,根据字面意思应该就知道这些方法是做什么用的了,这里就不做过多解释了
Service调试
Service程序不容易调试,一般我们可以通过写日志的方式调试,这里我介绍另外一种调试方式,通过编译指令把Service转换成普通程序,然后再进行调试,方法如下:
1.新建一个窗体MainFrm,将需要实现的功能写在这个单元
2.处理项目文件的单元头,添加一个编译指令DEBUG
program ProManage;
uses
{
$IFDEF DEBUG}
Forms,
{
$ELSE}
SvcMgr,
{
$ENDIF}
frmProMain in 'frmProMain.pas' {
MainFrm},
uService in 'uService.pas' {
PMTOH3sv: TService};
{
$R *.res}
begin
Application.Initialize;
Application.Title := 'PMTOH3';
{
$IFDEF DEBUG}
Application.CreateForm(TMainFrm, MainFrm);
{
$ELSE}
Application.CreateForm(TPMTOH3sv, PMTOH3sv);
{
$ENDIF}
Application.Run;
end.
3.把代码需要实现的功能全部在主窗体单元中实现,然后在ServiceStart中调用该主窗体,如下
procedure TPMTOH3sv.ServiceShutdown(Sender: TService);
begin
MainFrm.Free;
CoUninitialize;
Status := csStopped;
ReportStatus();
end;
procedure TPMTOH3sv.ServiceStart(Sender: TService; var Started: Boolean);
begin
CoInitialize(nil);
Started := True;
Svcmgr.Application.CreateForm(TMainFrm, MainFrm);
MainFrm.Hide;
end;
总结:这样当我们调试的时候设置Debug为True就可以直接调试,当调试完毕后我们把Debug设为False就可以编译成一个服务程序了
下面我给出一个完整的例子
工程文件:Project1.dpr