用 Delphi 创建服务程序
Windows 2000/XP 和 2003 等支持一种叫做"服务程序"的东西.程序作为服务启动有以下几个 好处: (1)不用登陆进系统即可运行. (2)具有 SYSTEM 特权.所以你在进程管理器里面是无法结束它的. 笔者在 2003 年为一公司开发机顶盒项目的时候,曾经写过
课件上传和媒体服务,下面就介绍 一下如何用 Delphi7 创建一个 Service 程序. 运行 Delphi7,选择菜单 File-->New-->Other--->Service Application.将生成一个服务程序 的框架.将工程保存为 ServiceDemo.dpr 和 Unit_Main.pas,然后回到主框架.我们注意 到,Service 有几个属性.其中以下几个是我们比较
常用的: (1)DisplayName:服务的显示名称 (2)Name:服务名称. 我们在这里将 DisplayName 的值改为"Delphi 服务演示程序",Name 改为"DelphiService".编 译这个项目,将得到 ServiceDemo.exe.这已经是一个服务
程序了!进入 CMD 模式,切换致工程 所在目录,运行命令"ServiceDemo.exe /install",将提示服务安装成功!然后"net start DelphiService"将启动这个服务.进入控制面版-->管理工具-->服务,将显示这个服务和当前 状 态 . 不 过 这 个 服 务 现 在 什 么 也 干 不 了 , 因 为 我 们 还 没 有 写 代 码 :) 先 "net stop DelphiService"停止再"ServiceDemo.exe /uninstall"删除这个服务.回到 Delphi7 的 IDE. 我们的计划是为这个服务添加一个主窗口,运行后任务栏显示程序的图标,双击图标将显示主 窗口,上面有一个按钮,点击该按钮将实现 Ctrl+Alt+Del 功能. 实际上,服务程序莫认是
工作于 Winlogon 桌面的,可以打开控制面板,查看我们刚才那个服务 的属性-->
登陆,其中"允许服务与桌面交互 "是不打钩的.怎么办?呵呵,回到 IDE,注意那个 布尔属性:Interactive,当这个属性为 True 的时候,该服务程序就可以与桌面交互了. File-->New-->Form 为服务添加窗口 FrmMain,单元保存为 Unit_FrmMain,并且把这个窗口设 置为手工创建.完成后的代码如下:
unit Unit_Main; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,
1 / 17
Unit_FrmMain; type TDelphiService = class(TService) procedure ServiceContinue(Sender: TService; var Continued: Boolean); procedure ServiceExecute(Sender: TService); procedure ServicePause(Sender: TService; var Paused: Boolean); procedure ServiceShutdown(Sender: TService); procedure ServiceStart(Sender: TService; var Started: Boolean); procedure ServiceStop(Sender: TService; var Stopped: Boolean); private { Private declarations } public function GetServiceController: TServiceController; override; { Public declarations } end; var DelphiService: T
DelphiService; FrmMain: TFrmMain; implementation {$R *.DFM} procedure ServiceController(CtrlCode: DWord); stdcall; begin DelphiService.Controller(CtrlCode); end; function TDelphiService.GetServiceController: TServiceController; begin Result := ServiceControlle
r; end; procedure TDelphiService.ServiceContinue(Sender: TService; var Continued: Boolean); begin while not Terminated do begin Sleep(10); ServiceThread.ProcessRequests(False); end; end;
2 / 17
procedure TDelphiService.ServiceExecute(Sender: TService); begin while not Terminated do begin Sleep(10); ServiceThread.ProcessRequests(False); end; end; procedure TDelphiService.ServicePause(Sender: TService; var Paused: Boolean); begin Paused := True; end; procedure TDelphiService.ServiceShutdown(Sender: TService); begin gbCanClose := true; FrmMain.Free; Status := csStopped; ReportStatus(); end; procedure TDelphiService.ServiceStart(Sender: TServi