Windows 服務是長期運行於後台、無需用戶登入即可啟動的特殊應用程式。本文系統梳理服務開發核心 API 分類、關鍵流程,並提供完整的 C++ 服務管理範例代碼。
| API | 用途 |
|---|---|
ServiceMain | 服務入口點,類似 main,由 SCM 調用啟動。 |
RegisterServiceCtrlHandler / Ex | 註冊控制處理函數,接收停止、暫停、繼續、關機等控制碼。 |
SetServiceStatus | 向 SCM 報告當前狀態(啟動中、運行中、停止中、已停止等)。 |
StartServiceCtrlDispatcher | 主線程調用,連接 SCM 並分派控制請求,通常不返回直到服務停止。 |
SetServiceBits | 向服務控制管理器註冊服務類型標誌。 |
| API | 用途 |
|---|---|
OpenSCManager | 打開服務控制管理器資料庫連接(本機或遠端)。 |
CreateService | 創建服務對象並寫入資料庫(指定啟動類型、路徑、帳號等)。 |
OpenService | 打開現有服務獲取句柄。 |
StartService / ControlService | 啟動服務 / 發送控制碼(停止、暫停、自定義)。 |
ChangeServiceConfig / Config2 | 修改啟動類型 / 服務描述、失敗恢復動作等。 |
QueryServiceStatusEx / QueryServiceConfig | 查詢運行狀態 / 靜態配置。 |
DeleteService | 標記服務刪除(下次重啟或關閉句柄時生效)。 |
EnumServicesStatusEx | 枚舉所有服務狀態。 |
CloseServiceHandle | 關閉 SCM/服務句柄,釋放資源。 |
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;
}
SetServiceStatus(SERVICE_RUNNING)。SERVICE_CONTROL_STOP:設置停止事件、通知工作線程退出、清理資源、最終 SetServiceStatus(SERVICE_STOPPED)。SERVICE_AUTO_START(開機自動)、SERVICE_DEMAND_START(手動)、SERVICE_DISABLED(禁用)。SERVICE_ERROR_NORMAL(記錄錯誤繼續)、SERVICE_ERROR_SEVERE(最後一次正確配置)、SERVICE_ERROR_CRITICAL(藍屏)。Windows 服務開發核心在於理解 SCM 與服務進程的協議交互:註冊處理器 → 報告狀態 → 響應控制碼。掌握上述 API 體系與範例模板,可快速構建穩健的後台服務程式。