首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 編寫 Windows 2000 服務程式完整指南

     編輯:Delphi

Windows 服務(Service Application)是在背景執行、不需使用者登入即可啟動的特殊程式,具備高權限且不易被工作管理員終止。Delphi 提供 TServiceApplication、TService、TServiceThread 完整封裝,大幅簡化服務開發。本文深入解析架構與關鍵實作要點。

服務架構核心類別

TServiceApplication 運作流程

  1. 解析命令列參數:/install、/uninstall、/silent 等
  2. 建立 ServiceStartTable 陣列:包含各服務名稱與進入點
  3. 啟動 TServiceStartThread 呼叫 StartServiceCtrlDispatcher 註冊服務控制處理常式
  4. 主執行緒進入訊息迴圈,處理服務控制管理器(SCM)發來的停止/暫停/繼續請求

TService 關鍵事件與方法

類別對應實體說明
TServiceApplicationService Application (EXE)專案 Application 物件,管理多個 Service
TServiceService (單一服務)繼承 TDataModule,可放置非視覺元件,每個服務一執行緒
TServiceThread服務工作執行緒內部執行緒,處理 OnExecute 邏輯
事件/方法觸發時機用途
OnCreate服務物件建立初始化資源、資料庫連線
OnStart服務啟動啟動監聽、排程、背景工作
OnExecute服務主執行緒運行**核心工作迴圈**(見下文)
OnPause服務暫停釋放非必要資源
OnContinue服務繼續恢復資源
OnStop服務停止清理、關閉連線、設 Terminated=True
OnShutdown系統關機/服務應用程式結束所有服務同時終止,最後機會存檔

OnExecute 正確實作模式

服務必須同時處理**業務邏輯**與**外部控制請求**(停止/暫停)。錯誤做法:在 OnExecute 內執行阻塞式工作(如 Accept 監聽),導致無法響應停止請求。

正確模式:專用工作執行緒 + 請求處理迴圈

procedure TMyService.ServiceExecute(Sender: TService);
var WorkThread: TThread;
begin
  WorkThread := TWorkerThread.Create(False); // 啟動業務執行緒
  try
    while not Terminated do begin
      ServiceThread.ProcessRequests(False); // 處理 SCM 請求(非阻塞)
      Sleep(100); // 避免佔滿 CPU
    end;
  finally
    WorkThread.Terminate;
    WorkThread.WaitFor; // 等待業務執行緒結束
    WorkThread.Free;
  end;
end;

業務執行緒範例

type TWorkerThread = class(TThread)
  protected
    procedure Execute; override;
  end;

procedure TWorkerThread.Execute;
begin
  while not Terminated do begin
    // 實際工作:Socket 監聽、定時任務、檔案監控等
    // 使用非阻塞/可中斷的 API(如 TIdTCPServer、WaitForSingleObject)
    Sleep(1000);
  end;
end;

安裝與除錯技巧

  • 安裝:專案輸出 EXE,以管理員身分執行 MyService.exe /install
  • 除錯:Run → Parameters → /debug 以應用程式模式啟動,可設中斷點
  • 事件檢視器:服務啟動/停止/錯誤記錄在系統日誌
  • 依賴關係:專案選項中設定服務相依(如需資料庫先啟動)

常見坑點

  • ❌ OnExecute 內直接阻塞 → 服務無法停止,SCM 顯示「無回應」
  • ❌ 使用視覺元件(TForm、TButton) → 服務無桌面互動權限會失敗
  • ❌ 忽略 OnShutdown → 系統關機時資料未存盤
  • ❌ 執行緒同步不當 → 存取共享資料競態

現代化建議

新專案建議使用 TTopShelf、NSSM 或 .NET Core Worker Service / Go / Rust 等跨平台方案;維護舊 Delphi 專案時,上述模式仍是最佳實踐。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved