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

Windows 服務控制完全指南:啟動、停止、暫停與繼續的 C++ 實現

     編輯:關於C語言

核心 API 概覽

Windows 服務控制管理器 (SCM) 提供一組 API 供應用程式管理服務生命週期。關鍵函數包括:

  • OpenSCManager — 打開服務控制管理器資料庫
  • OpenService — 獲取特定服務的句柄
  • StartService — 啟動服務
  • ControlService — 發送控制碼(停止、暫停、繼續等)
  • QueryServiceStatus — 查詢服務當前狀態

完整控制代碼範例

#include <windows.h>
#include <stdio.h>

BOOL ControlServiceExample(const char* svcName) {
    SC_HANDLE scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    if (!scm) {
        printf("OpenSCManager 失敗: %lu\n", GetLastError());
        return FALSE;
    }

    SERVICE_STATUS status = {0};
    SC_HANDLE svc = NULL;
    BOOL result = FALSE;

    // ---------- 1. 啟動服務 ----------
    svc = OpenService(scm, svcName, SERVICE_START);
    if (svc) {
        if (StartService(svc, 0, NULL)) {
            printf("服務啟動請求已發送\n");
            result = TRUE;
        } else {
            printf("StartService 失敗: %lu\n", GetLastError());
        }
        CloseServiceHandle(svc);
    }

    // ---------- 2. 停止服務 ----------
    svc = OpenService(scm, svcName, SERVICE_STOP | SERVICE_QUERY_STATUS);
    if (svc) {
        if (QueryServiceStatus(svc, &status)) {
            if (status.dwCurrentState == SERVICE_RUNNING || 
                status.dwCurrentState == SERVICE_PAUSED) {
                if (ControlService(svc, SERVICE_CONTROL_STOP, &status)) {
                    printf("服務停止請求已發送\n");
                    result = TRUE;
                }
            }
        }
        CloseServiceHandle(svc);
    }

    // ---------- 3. 暫停服務 ----------
    svc = OpenService(scm, svcName, SERVICE_PAUSE_CONTINUE | SERVICE_QUERY_STATUS);
    if (svc) {
        if (QueryServiceStatus(svc, &status)) {
            if (status.dwCurrentState == SERVICE_RUNNING) {
                if (ControlService(svc, SERVICE_CONTROL_PAUSE, &status)) {
                    printf("服務暫停請求已發送\n");
                    result = TRUE;
                }
            }
        }
        CloseServiceHandle(svc);
    }

    // ---------- 4. 繼續服務 ----------
    svc = OpenService(scm, svcName, SERVICE_PAUSE_CONTINUE | SERVICE_QUERY_STATUS);
    if (svc) {
        if (QueryServiceStatus(svc, &status)) {
            if (status.dwCurrentState == SERVICE_PAUSED) {
                if (ControlService(svc, SERVICE_CONTROL_CONTINUE, &status)) {
                    printf("服務繼續請求已發送\n");
                    result = TRUE;
                }
            }
        }
        CloseServiceHandle(svc);
    }

    CloseServiceHandle(scm);
    return result;
}

關鍵注意事項

項目說明
服務名稱 vs 顯示名稱API 需要服務名稱(如 wuauserv),非顯示名稱(如 "Windows Update")
權限要求需管理員權限;SCM 句柄需 SC_MANAGER_ALL_ACCESS 或對應權限
狀態檢查發送控制碼前務必用 QueryServiceStatus 確認當前狀態,避免無效操作
異步特性ControlService 為異步請求,返回 TRUE 僅表示請求已接受,非操作完成
資源釋放每個 OpenService 產生的句柄必須配對 CloseServiceHandle

服務狀態碼對照

SERVICE_STOPPED          0x00000001
SERVICE_START_PENDING    0x00000002
SERVICE_STOP_PENDING     0x00000003
SERVICE_RUNNING          0x00000004
SERVICE_CONTINUE_PENDING 0x00000005
SERVICE_PAUSE_PENDING    0x00000006
SERVICE_PAUSED           0x00000007

進階建議

  • 生產環境建議實現輪詢等待機制,確認狀態實際轉換完成
  • 錯誤處理應記錄 GetLastError() 並提供用戶友好提示
  • 考慮封裝為 RAII 風格的 C++ 類,自動管理句柄生命週期
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved