Delphi利用多线程创建系统服务

本文介绍如何使用Delphi通过多线程创建一个系统服务,该服务开机自动运行,能检测特定程序是否运行,如果程序未运行则每5秒显示提示消息。服务设置了交互模式,并在关机时释放资源以确保正常关机。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 程序功能:创建系统服务,开机自动运行,监测某一程序是否正在运行,如果没有运行,则每隔5秒弹出一个提示消息框

程序实现:

 

1、启动Delphi6.0或者7.0 File->New->Other...->Service Application

 

2、设置服务属性  Interactive := True;   DisplayName := '监测当前进程';   Name := 'InspectService';(Interactive := True确保服务可以与桌面交互)

 

3、添加新的Form,Unit名称Unit_FrmMain,Form名称FrmMain

 

4、编写弹出消息线程:MessageThread

特别注意:一定要编写关机事件并注册,否则由于服务不能停止导致无法关机

 

程序源代码如下:

 

工程文件

 

  1. Program InspectExe; 
  2. Uses 
  3.   SvcMgr, 
  4.   Unit_Main In 'Unit_Main.pas' {InspectService: TService}
  5.   Unit_FrmMain In 'Unit_FrmMain.pas' {FrmMain}
  6. {$R *.RES} 
  7. Begin 
  8.   Application.Initialize; 
  9.   Application.CreateForm(TInspectService, InspectService); 
  10.   Application.Run; 
  11. End. 

 

服务单元

 

  1. Unit Unit_Main; 
  2. Interface 
  3. Uses 
  4.   Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs, WinSvc, 
  5.   Unit_FrmMain; 
  6. Type 
  7.   TInspectService = Class(TService) 
  8.     Procedure ServiceContinue(Sender: TService; Var Continued: Boolean); 
  9.     Procedure ServiceExecute(Sender: TService); 
  10.     Procedure ServicePause(Sender: TService; Var Paused: Boolean); 
  11.     Procedure ServiceShutdown(Sender: TService); 
  12.     Procedure ServiceStart(Sender: TService; Var Started: Boolean); 
  13.     Procedure ServiceStop(Sender: TService; Var Stopped: Boolean); 
  14.   private 
  15.     { Private declarations } 
  16.   public 
  17.     Function GetServiceController: TServiceController; override; 
  18.     Constructor CreateNew(AOwner: TComponent; Dummy: Integer); override; 
  19.     { Public declarations } 
  20.   End; 
  21. Var 
  22.   InspectService: TInspectService; 
  23.   FrmMain: TFrmMain; 
  24. Implementation 
  25. {$R *.DFM} 
  26. Constructor TInspectService.CreateNew(AOwner: TComponent; Dummy: Integer); 
  27. Begin 
  28.   Inherited CreateNew(AOwner, Dummy); 
  29.   AllowPause := True; 
  30.   Interactive := True; 
  31.   DisplayName := '监测当前进程'
  32.   Name := 'InspectService'
  33.   //OnContinue := ServiceContinue; 
  34.   //OnPause := ServicePause; 
  35.   OnShutdown := ServiceShutdown; 
  36.   OnStart := ServiceStart; 
  37.   OnStop := ServiceStop; 
  38. End; 
  39. Procedure ServiceController(CtrlCode: DWord); stdcall; 
  40. Begin 
  41.   InspectService.Controller(CtrlCode); 
  42. End; 
  43. Function TInspectService.GetServiceController: TServiceController; 
  44. Begin 
  45.   Result := ServiceController; 
  46. End; 
  47. Procedure TInspectService.ServiceContinue(Sender: TService; 
  48.   Var Continued: Boolean); 
  49. Begin 
  50.   While Not Terminated Do 
  51.   Begin 
  52.     Sleep(10); 
  53.     ServiceThread.ProcessRequests(False); 
  54.   End; 
  55. End; 
  56. Procedure TInspectService.ServiceExecute(Sender: TService); 
  57. Begin 
  58.   While Not Terminated Do 
  59.   Begin 
  60.     Sleep(10); 
  61.     ServiceThread.ProcessRequests(False); 
  62.   End; 
  63. End; 
  64. Procedure TInspectService.ServicePause(Sender: TService; 
  65.   Var Paused: Boolean); 
  66. Begin 
  67.   Paused := True; 
  68. End; 
  69. Procedure TInspectService.ServiceShutdown(Sender: TService); 
  70. Begin 
  71.   BCanClose := True; 
  72.   WorkStus := False;//关机的时候停止发送消息,确保能够正常关机 
  73.   FrmMain.Free; 
  74.   Status := csStopped; 
  75.   ReportStatus(); 
  76. End; 
  77. Procedure TInspectService.ServiceStart(Sender: TService; 
  78.   Var Started: Boolean); 
  79. Begin 
  80.   Started := True; 
  81.   SvcMgr.Application.CreateForm(TFrmMain, FrmMain); 
  82.   BCanClose := False; 
  83.   WorkStus := True; 
  84.   FrmMain.Hide; 
  85.   //WriteErrLog('<' + FormatDateTime('YYYY-MM-DD HH:NN:SS', Now) + '>' + 'InspectService is started'); 
  86. End; 
  87. Procedure TInspectService.ServiceStop(Sender: TService; 
  88.   Var Stopped: Boolean); 
  89. Begin 
  90.   Stopped := True; 
  91.   BCanClose := True; 
  92.   WorkStus := False; 
  93.   FrmMain.Free; 
  94. End; 
  95. End. 

新添加的Form

 

  1. Unit Unit_FrmMain; 
  2. Interface 
  3. Uses 
  4.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
  5.   Dialogs, ExtCtrls, TlHelp32; 
  6. Type 
  7.   TFrmMain = Class(TForm) 
  8.     Procedure FormCreate(Sender: TObject); 
  9.     Procedure FormCloseQuery(Sender: TObject; Var CanClose: Boolean); 
  10.   private 
  11.     { Private declarations } 
  12.   public 
  13.     { Public declarations } 
  14.   End; 
  15. Type 
  16.   MessageThread = Class(TThread) {发送消息线程} 
  17.   private 
  18.     { Private declarations } 
  19.   protected 
  20.     Procedure Execute; override; 
  21.   public 
  22.     Constructor Create(); 
  23.     Procedure SendMessage; 
  24.     Function InspectProcedureExists(ExeName: String): Boolean; 
  25.     { Public declarations } 
  26.   End; 
  27. Var 
  28.   FrmMain: TFrmMain; 
  29.   BCanClose: Boolean; 
  30.   WorkStus: Boolean; {是否启用发送消息线程} 
  31.   objThread: MessageThread; 
  32. Implementation 
  33. {$R *.dfm} 
  34. Constructor MessageThread.Create(); 
  35. Begin 
  36.   FreeOnTerminate := True; 
  37.   Inherited Create(False); 
  38.   WorkStus := True; 
  39. End; 
  40. Procedure MessageThread.Execute; 
  41. Begin 
  42.   While WorkStus Do 
  43.   Begin 
  44.     Sleep(5000); 
  45.     Application.ProcessMessages; 
  46.     Synchronize(SendMessage); 
  47.   End; 
  48. End; 
  49. Procedure MessageThread.SendMessage; 
  50. Var 
  51.   ExeName: String; 
  52. Begin 
  53.   ExeName := 'test.exe'
  54.   If Not InspectProcedureExists(ExeName) Then 
  55.     MessageDlg(ExeName + '未启动', mtinformation, [mbok], 0); 
  56. End; 
  57. {判断系统当前进程中是否存在指定的Exe名称} 
  58. Function MessageThread.InspectProcedureExists(ExeName: String): Boolean; 
  59. Var 
  60.   hSnapshot: THandle; 
  61.   lppe: TProcessEntry32; 
  62.   Found: Boolean; 
  63. Begin 
  64.   Result := False; 
  65.   hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
  66.   lppe.dwSize := SizeOf(TProcessEntry32); 
  67.   Found := Process32First(hSnapshot, lppe); 
  68.   While Found Do 
  69.   Begin 
  70.     If ((UpperCase(ExtractFileName(lppe.szExeFile)) = UpperCase(ExeName)) Or (UpperCase(lppe.szExeFile) = UpperCase('ExeName'))) Then 
  71.     Begin 
  72.       Result := True; 
  73.       break; 
  74.     End; 
  75.     Found := Process32Next(hSnapshot, lppe); 
  76.   End; 
  77. End; 
  78. { TFrmMain } 
  79. Procedure TFrmMain.FormCreate(Sender: TObject); 
  80. Begin 
  81.   SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW); 
  82.   BCanClose := False; 
  83.   objThread := MessageThread.Create; 
  84. End; 
  85. Procedure TFrmMain.FormCloseQuery(Sender: TObject; Var CanClose: Boolean); 
  86. Begin 
  87.   BCanClose := CanClose; 
  88.   If Not CanClose Then 
  89.   Begin 
  90.     Hide; 
  91.   End; 
  92. End; 
  93. End. 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值