共用方式為


服務狀態轉換

服務負責向服務控制管理員報告其狀態變更(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