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

Windows 服務程式開發完整指南:核心 API、控制流程與實戰範例

     編輯:關於C語言

前言

Windows 服務是長期運行於後台、無需用戶登入即可啟動的特殊應用程式。本文系統梳理服務開發核心 API 分類、關鍵流程,並提供完整的 C++ 服務管理範例代碼。

一、服務程式內部核心 API(由服務自身調用)

API用途
ServiceMain服務入口點,類似 main,由 SCM 調用啟動。
RegisterServiceCtrlHandler / Ex註冊控制處理函數,接收停止、暫停、繼續、關機等控制碼。
SetServiceStatus向 SCM 報告當前狀態(啟動中、運行中、停止中、已停止等)。
StartServiceCtrlDispatcher主線程調用,連接 SCM 並分派控制請求,通常不返回直到服務停止。
SetServiceBits向服務控制管理器註冊服務類型標誌。

二、服務管理與配置 API(由管理工具/安裝程式調用)

API用途
OpenSCManager打開服務控制管理器資料庫連接(本機或遠端)。
CreateService創建服務對象並寫入資料庫(指定啟動類型、路徑、帳號等)。
OpenService打開現有服務獲取句柄。
StartService / ControlService啟動服務 / 發送控制碼(停止、暫停、自定義)。
ChangeServiceConfig / Config2修改啟動類型 / 服務描述、失敗恢復動作等。
QueryServiceStatusEx / QueryServiceConfig查詢運行狀態 / 靜態配置。
DeleteService標記服務刪除(下次重啟或關閉句柄時生效)。
EnumServicesStatusEx枚舉所有服務狀態。
CloseServiceHandle關閉 SCM/服務句柄,釋放資源。

三、已棄用 API(僅維護舊代碼時參考)

EnumServicesStatus、LockServiceDatabase、QueryServiceLockStatus、QueryServiceStatus、UnlockServiceDatabase。新代碼請使用 Ex 版本。

四、完整服務管理範例

#include 
#include 

// 服務操作封裝
bool Start_Service(LPCWSTR name) {
    SC_HANDLE hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    if (!hSCM) return false;
    SC_HANDLE hSvc = OpenService(hSCM, name, SERVICE_ALL_ACCESS);
    if (!hSvc) { CloseServiceHandle(hSCM); return false; }
    bool ret = StartService(hSvc, 0, NULL);
    CloseServiceHandle(hSvc); CloseServiceHandle(hSCM);
    return ret;
}

bool Stop_Service(LPCWSTR name) {
    SC_HANDLE hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    if (!hSCM) return false;
    SC_HANDLE hSvc = OpenService(hSCM, name, SERVICE_ALL_ACCESS);
    if (!hSvc) { CloseServiceHandle(hSCM); return false; }
    SERVICE_STATUS ss;
    bool ret = ControlService(hSvc, SERVICE_CONTROL_STOP, &ss);
    CloseServiceHandle(hSvc); CloseServiceHandle(hSCM);
    return ret;
}

bool Create_Service(LPCWSTR name, LPCWSTR display, LPCWSTR path) {
    SC_HANDLE hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    if (!hSCM) return false;
    SC_HANDLE hSvc = CreateService(hSCM, name, display, SERVICE_ALL_ACCESS,
        SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL,
        path, NULL, NULL, NULL, NULL, NULL);
    CloseServiceHandle(hSvc); CloseServiceHandle(hSCM);
    return hSvc != NULL;
}

void EnumService() {
    SC_HANDLE hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE);
    if (!hSCM) return;
    DWORD bytesNeeded, count, resume = 0;
    EnumServicesStatusEx(hSCM, SC_ENUM_PROCESS_INFO, SERVICE_WIN32, SERVICE_STATE_ALL,
        NULL, 0, &bytesNeeded, &count, &resume, NULL);
    LPENUM_SERVICE_STATUS_PROCESS pBuf = (LPENUM_SERVICE_STATUS_PROCESS)malloc(bytesNeeded);
    if (EnumServicesStatusEx(hSCM, SC_ENUM_PROCESS_INFO, SERVICE_WIN32, SERVICE_STATE_ALL,
        (LPBYTE)pBuf, bytesNeeded, &bytesNeeded, &count, &resume, NULL)) {
        for (DWORD i = 0; i < count; ++i) {
            wprintf(L"%s\t%s\tState:%d\n", pBuf[i].lpServiceName, pBuf[i].lpDisplayName, pBuf[i].ServiceStatusProcess.dwCurrentState);
        }
    }
    free(pBuf); CloseServiceHandle(hSCM);
}

int wmain() {
    // 測試範例
    // Create_Service(L"MySvc", L"My Test Service", L"C:\\Path\\To\\Svc.exe");
    // Start_Service(L"MySvc");
    // Stop_Service(L"MySvc");
    // Delete_Service(L"MySvc");
    EnumService();
    return 0;
}

五、服務程式架構要點

  1. ServiceMain 中初始化資源、創建工作線程、調用 SetServiceStatus(SERVICE_RUNNING)。
  2. HandlerEx 處理 SERVICE_CONTROL_STOP:設置停止事件、通知工作線程退出、清理資源、最終 SetServiceStatus(SERVICE_STOPPED)。
  3. 啟動類型:SERVICE_AUTO_START(開機自動)、SERVICE_DEMAND_START(手動)、SERVICE_DISABLED(禁用)。
  4. 錯誤控制:SERVICE_ERROR_NORMAL(記錄錯誤繼續)、SERVICE_ERROR_SEVERE(最後一次正確配置)、SERVICE_ERROR_CRITICAL(藍屏)。
  5. 服務帳號:LocalSystem(高權限,無網絡憑證)、NetworkService/LocalService(受限)、特定用戶帳號(需密碼管理)。

總結

Windows 服務開發核心在於理解 SCM 與服務進程的協議交互:註冊處理器 → 報告狀態 → 響應控制碼。掌握上述 API 體系與範例模板,可快速構建穩健的後台服務程式。

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