Windows服務(Service)無需用戶登錄即可在後台運行,支援開機自啟、暫停/繼續、事件日誌記錄,是FTP、數據庫、監控類程序的標準部署形態。
SC_HANDLE OpenSCManager(
LPCTSTR lpMachineName, // 目標計算機,NULL為本機
LPCTSTR lpDatabaseName, // 數據庫類別,通常為SERVICES_ACTIVE_DATABASE
DWORD dwDesiredAccess // 權限:SC_MANAGER_CREATE_SERVICE等
);
SC_HANDLE CreateService(
SC_HANDLE hSCManager,
LPCTSTR lpServiceName, // 服務內部名稱
LPCTSTR lpDisplayName, // 顯示名稱
DWORD dwDesiredAccess, // SERVICE_ALL_ACCESS
DWORD dwServiceType, // SERVICE_WIN32_OWN_PROCESS
DWORD dwStartType, // SERVICE_AUTO_START自動啟動
DWORD dwErrorControl, // SERVICE_ERROR_NORMAL
LPCTSTR lpBinaryPathName, // 可執行文件完整路徑
LPCTSTR lpLoadOrderGroup,
LPDWORD lpdwTagId,
LPCTSTR lpDependencies, // 依賴服務組,雙重空字符結尾
LPCTSTR lpServiceStartName, // 啟動賬戶:LocalSystem/用戶賬戶
LPCTSTR lpPassword // 賬戶密碼
);
void WINAPI ServiceMain(DWORD dwArgc, LPTSTR* lpszArgv) {
// 1. 註冊控制處理器
hStatus = RegisterServiceCtrlHandler(szServiceName, HandlerEx);
// 2. 設置狀態:SERVICE_START_PENDING
SetServiceStatus(hStatus, &ssStatus);
// 3. 初始化資源(線程、Socket、資料庫連接等)
// 4. 設置狀態:SERVICE_RUNNING
ssStatus.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus(hStatus, &ssStatus);
// 5. 工作線程循環或等待事件
WaitForSingleObject(hStopEvent, INFINITE);
// 6. 清理並設置SERVICE_STOPPED
}
DWORD WINAPI HandlerEx(DWORD dwControl, DWORD dwEventType,
LPVOID lpEventData, LPVOID lpContext) {
switch (dwControl) {
case SERVICE_CONTROL_STOP:
ssStatus.dwCurrentState = SERVICE_STOP_PENDING;
SetServiceStatus(hStatus, &ssStatus);
SetEvent(hStopEvent); // 通知主線程退出
return NO_ERROR;
case SERVICE_CONTROL_PAUSE:
// 暫停業務邏輯
break;
case SERVICE_CONTROL_CONTINUE:
// 恢復業務邏輯
break;
case SERVICE_CONTROL_INTERROGATE:
// 查詢狀態
break;
}
return NO_ERROR;
}
sc create命令行工具快速註冊服務-install/-remove/-debug參數,-debug下作為控制台程序運行便於調試Applications and Services Logs查看服務啟動/錯誤日誌Netman(網絡連接管理器)確保網絡就緒後再啟動SERVICE_SID_TYPE_UNRESTRICTED)隔離資源訪問SERVICE_LAUNCH_PROTECTED防止非簽名代碼注入