服務 (Service) 是無 UI、長期運行、可開機自動啟動、支援暫停/繼續/停止控制的後台程式。所有服務資訊儲存在 **Service Control Manager (SCM) 資料庫** 中。開發者透過 SCM API 進行:安裝/移除、啟動/停止/暫停/繼續、查詢狀態、設定參數。
| API | 用途 |
OpenSCManager | 連接本機/遠端 SCM,取得管理者控制代碼 |
CreateService | 在 SCM 建立服務記錄 (安裝) |
OpenService | 開啟既有服務取得服務控制代碼 |
StartService | 啟動服務 |
ControlService | 發送控制碼 (停止/暫停/繼續/自訂) |
QueryServiceStatus | 查詢服務當前狀態 (運行/停止/暫停/啟動中...) |
DeleteService | 移除服務記錄 (解除安裝) |
CloseServiceHandle | 關閉 SCM/服務控制代碼 |
ChangeServiceConfig | 修改服務參數 (啟動類型、錯誤控制、二進位路徑...) |
OpenSCManager 詳解
SC_HANDLE OpenSCManager(
LPCTSTR lpMachineName, // NULL = 本機;遠端電腦名
LPCTSTR lpDatabaseName, // NULL = 預設 SERVICES_ACTIVE_DATABASE
DWORD dwDesiredAccess // 權限掩碼
);
常用權限常數
SC_MANAGER_ALL_ACCESS (0xF003F) —— 完整權限。
SC_MANAGER_CONNECT (0x0001) —— 僅連接。
SC_MANAGER_CREATE_SERVICE (0x0002) —— 建立服務。
SC_MANAGER_ENUMERATE_SERVICE (0x0004) —— 列舉服務。
SC_MANAGER_LOCK (0x0008) —— 鎖定資料庫。
SC_MANAGER_QUERY_LOCK_STATUS (0x0010) —— 查詢鎖定狀態。
SC_MANAGER_MODIFY_BOOT_CONFIG (0x0020) —— 修改開機配置。
服務程式本體架構 (C++Builder)
C++Builder 無原生服務專案範本 (Delphi 有),需手動實現:
WinMain (或 main) 判斷參數:/install, /remove, /service (SCM 啟動)。
/service 路徑:呼叫 StartServiceCtrlDispatcher 連接 SCM,提供 ServiceMain 入口。
ServiceMain:註冊 HandlerEx (控制碼處理)、設定狀態 SERVICE_START_PENDING → 初始化 → SERVICE_RUNNING → 工作迴圈/執行緒 → 停止時 SERVICE_STOP_PENDING → 清理 → SERVICE_STOPPED。
HandlerEx:處理 SERVICE_CONTROL_STOP, PAUSE, CONTINUE, INTERROGATE, SHUTDOWN 等控制碼。
安裝/移除服務範例
bool InstallService(LPCTSTR name, LPCTSTR display, LPCTSTR path) {
SC_HANDLE scm = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
if (!scm) return false;
SC_HANDLE svc = CreateService(scm, name, display,
SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,
SERVICE_AUTO_START, SERVICE_ERROR_NORMAL,
path, NULL, NULL, NULL, NULL, NULL);
bool ok = (svc != NULL);
if (svc) CloseServiceHandle(svc);
CloseServiceHandle(scm);
return ok;
}
bool RemoveService(LPCTSTR name) {
SC_HANDLE scm = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT);
if (!scm) return false;
SC_HANDLE svc = OpenService(scm, name, DELETE);
bool ok = false;
if (svc) { ok = DeleteService(svc); CloseServiceHandle(svc); }
CloseServiceHandle(scm);
return ok;
}
現代替代:Windows 服務框架 / 使用者模式服務
- C++Builder:使用第三方框架 (如
TService 元件套件) 或改用 Delphi 建立服務專案再混合編譯。
- 純 C++:
CAtlServiceModuleT (ATL)、winrt::Windows::ApplicationModel::Background (UWP 背景任務)、NSSM (Non-Sucking Service Manager) 包裝普通 EXE 為服務。
- 使用者模式服務 (User-mode Service, Vista+):無需 SCM 安裝,以 COM 物件形式在共享進程 (svchost) 運行,較輕量。
總結
Windows NT 服務程式設計核心是 **SCM API 操作資料庫** 與 **服務程式實現控制介面**。OpenSCManager 開啟管理者控制代碼是所有操作起點。C++Builder 開發者需手動實現服務入口與控制處理器,或引入成熟框架。現代開發優先考慮使用者模式服務、背景任務或容器化部署 (Docker/K8s),傳統 Win32 服務適用於需深度系統整合、開機極早啟動、硬體驅動協作的場景。
- 上一篇文章: C++Builder 系統托盤圖示演示:完整生命週期與右鍵選單
- 下一篇文章: Windows 關機/重啟/登出 API 完整指南:從 Win9x 到 NT 核心的權限與實現
Copyright ©
程式碼之家 All Rights Reserved