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

Windows NT 服務程式開發全攻略:從 SCM 架構到完整實現

     編輯:關於C++

核心概念:服務控制管理器 (SCM)

NT 服務由 SCM (services.exe) 統一管理,採用資料庫存儲服務配置。服務程式包含兩部分:服務主體 (Console 應用) 與控制程式 (GUI 應用,負責安裝/啟動/停止/刪除)。

關鍵 API 全景

API用途
OpenSCManager打開 SCM 數據庫,獲取管理句柄
CreateService在 SCM 中註冊新服務,指定類型、啟動方式、路徑等
OpenService打開現有服務獲取服務句柄
StartService啟動服務
ControlService發送控制碼 (停止/暫停/繼續/查詢)
QueryServiceStatus查詢服務當前狀態
DeleteService從 SCM 刪除服務

服務主體三大核心函數

1. main() —— 進程入口,連接 SCM


int main() {
    SERVICE_TABLE_ENTRY ste[2] = {
        {"W.Z.SERVICE", ServiceMain},
        {NULL, NULL}
    };
    StartServiceCtrlDispatcher(ste); // 阻塞直到所有服務停止
    return 0;
}

2. ServiceMain() —— 服務真正入口,專用線程執行

  • 立即調用 RegisterServiceCtrlHandler 註冊 Handler。
  • 調用 SetServiceStatus 上報狀態:SERVICE_START_PENDING → 初始化 → SERVICE_RUNNING。
  • 執行核心業務循環 (Mycode())。

3. Handler() —— 主線程執行,處理控制碼


void WINAPI Handler(DWORD Opcode) {
    switch (Opcode) {
        case SERVICE_CONTROL_STOP:
            // 執行停止邏輯
            ss.dwCurrentState = SERVICE_STOPPED;
            SetServiceStatus(ssh, &ss);
            break;
        case SERVICE_CONTROL_INTERROGATE:
            SetServiceStatus(ssh, &ss);
            break;
    }
}

控制程式實現 (Delphi/C++Builder 示例)

四個按鈕對應 CreateService、DeleteService、StartService、ControlService(SERVICE_CONTROL_STOP)。刪除前必須先停止運行中的服務。

編譯驗證

C++Builder 5.0 + Windows 2000 編譯通過。讀者只需在 Mycode() 填入業務邏輯即可擁有完整可用的 NT 服務框架。

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