NT 服務由 SCM (services.exe) 統一管理,採用資料庫存儲服務配置。服務程式包含兩部分:服務主體 (Console 應用) 與控制程式 (GUI 應用,負責安裝/啟動/停止/刪除)。
| API | 用途 |
|---|---|
OpenSCManager | 打開 SCM 數據庫,獲取管理句柄 |
CreateService | 在 SCM 中註冊新服務,指定類型、啟動方式、路徑等 |
OpenService | 打開現有服務獲取服務句柄 |
StartService | 啟動服務 |
ControlService | 發送控制碼 (停止/暫停/繼續/查詢) |
QueryServiceStatus | 查詢服務當前狀態 |
DeleteService | 從 SCM 刪除服務 |
main() —— 進程入口,連接 SCM
int main() {
SERVICE_TABLE_ENTRY ste[2] = {
{"W.Z.SERVICE", ServiceMain},
{NULL, NULL}
};
StartServiceCtrlDispatcher(ste); // 阻塞直到所有服務停止
return 0;
}
ServiceMain() —— 服務真正入口,專用線程執行RegisterServiceCtrlHandler 註冊 Handler。SetServiceStatus 上報狀態:SERVICE_START_PENDING → 初始化 → SERVICE_RUNNING。Mycode())。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;
}
}
四個按鈕對應 CreateService、DeleteService、StartService、ControlService(SERVICE_CONTROL_STOP)。刪除前必須先停止運行中的服務。
C++Builder 5.0 + Windows 2000 編譯通過。讀者只需在 Mycode() 填入業務邏輯即可擁有完整可用的 NT 服務框架。