共用方式為


服務狀態轉換

服務負責向服務控制管理員報告其狀態變更, (SCM) 。 服務控制程式和系統只能從 SCM 找出服務的狀態,因此服務必須正確地報告其狀態。 服務會呼叫 SetServiceStatus 函式,並使用完全初始化 SERVICE_STATUS 結構的指標來報告其狀態。 結構的 dwCurrentState 成員包含要回報的服務狀態。

服務的初始狀態SERVICE_STOPPED。 當 SCM 啟動服務時,它會將服務狀態設定為SERVICE_START_PENDING,並呼叫服務的 ServiceMain 函 式。 服務接著會使用 ServiceMain 函式中所述的其中一種技術來完成初始化。 服務完成初始化並準備好開始接收控制要求之後,服務會呼叫 SetServiceStatus 來報告SERVICE_RUNNING並指定服務準備接受的控制要求。 從SERVICE_START_PENDING轉換到SERVICE_RUNNING表示服務已成功啟動的 SCM 和服務監視工具。 如果服務回報SERVICE_RUNNING以外的狀態,SCM 或服務監視工具可能會將服務標示為無法啟動。

SCM 只會將指定的控制要求傳送至服務 (,但SERVICE_CONTROL_INTERROGATE要求除外,一律會傳送) 。 如需服務可接受的控制要求清單,請參閱SERVICE_STATUS結構的dwControlsAccepted成員。 如需註冊以接收裝置事件的相關資訊,請參閱 RegisterDeviceNotification 函式

服務狀態通常會因為處理控制項要求而變更。 控制造成服務狀態變更的要求包括SERVICE_CONTROL_STOP、SERVICE_CONTROL_PAUSE和SERVICE_CONTROL_CONTINUE。 如果服務必須執行冗長的處理來處理上述任何要求,它應該建立次要執行緒來執行冗長的處理,並將對應的擱置狀態回報給 SCM。 (為了在 Windows Vista 和更新版本的 Windows 上獲得最佳效能,服務應該針對此目的使用 執行緒集 區的背景工作執行緒。) 服務應該會在處理冗長時回報已完成的狀態轉換。 如需處理控制要求的詳細資訊,請參閱 服務控制處理常式函式

只有特定服務狀態轉換有效。 下圖顯示有效的轉換。

有效的服務狀態轉換

回報給 SCM 的服務狀態會決定 SCM 與服務互動的方式。 例如,如果服務報告SERVICE_STOP_PENDING,SCM 不會將進一步的控制要求傳送至服務,因為此狀態表示服務正在關閉。 服務所報告的下一個狀態應該SERVICE_STOPPED,因為這是SERVICE_STOP_PENDING之後的唯一有效狀態。 不過,如果服務回報不正確轉換,SCM 不會讓呼叫失敗。

下圖更詳細地顯示服務狀態轉換,包括服務控制程式所起始的控制項要求, (服務用戶端) ,以及服務對 SCM 報告狀態變更的 SetServiceStatus 呼叫。 如先前所述,SCM 只會傳送服務指定其將接受的控制要求,因此服務可能不會收到圖表中顯示的所有要求。

服務狀態轉換詳細資料

ControlService

ControlServiceEx

SetServiceStatus