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

Windows NT 服務程式設計:Service Control Manager 操作 API 詳解

     編輯:VC 教學

Windows 服務架構

服務 (Service) 是無 UI、長期運行、可開機自動啟動、支援暫停/繼續/停止控制的後台程式。所有服務資訊儲存在 **Service Control Manager (SCM) 資料庫** 中。開發者透過 SCM API 進行:安裝/移除、啟動/停止/暫停/繼續、查詢狀態、設定參數。

核心 API 概覽

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 有),需手動實現:

  1. WinMain (或 main) 判斷參數:/install, /remove, /service (SCM 啟動)。
  2. /service 路徑:呼叫 StartServiceCtrlDispatcher 連接 SCM,提供 ServiceMain 入口。
  3. ServiceMain:註冊 HandlerEx (控制碼處理)、設定狀態 SERVICE_START_PENDING → 初始化 → SERVICE_RUNNING → 工作迴圈/執行緒 → 停止時 SERVICE_STOP_PENDING → 清理 → SERVICE_STOPPED。
  4. 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 服務適用於需深度系統整合、開機極早啟動、硬體驅動協作的場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
API用途
OpenSCManager連接本機/遠端 SCM,取得管理者控制代碼
CreateService在 SCM 建立服務記錄 (安裝)
OpenService開啟既有服務取得服務控制代碼
StartService啟動服務
ControlService發送控制碼 (停止/暫停/繼續/自訂)
QueryServiceStatus查詢服務當前狀態 (運行/停止/暫停/啟動中...)
DeleteService移除服務記錄 (解除安裝)
CloseServiceHandle關閉 SCM/服務控制代碼
ChangeServiceConfig修改服務參數 (啟動類型、錯誤控制、二進位路徑...)