共用方式為


服務啟動

若要啟動服務或驅動程式服務,服務控制程式會使用 StartService 函式。 如果資料庫已鎖定,StartService 函式會失敗。 如果發生這種情況,服務控制程式應該等候幾秒鐘,然後再次呼叫 StartService。 它可以呼叫 QueryServiceLockStatus 函式來檢查資料庫的目前鎖定狀態。

如果服務控制程式正在啟動服務,則可以使用 StartService 函式,指定要傳遞至服務 ServiceMain 函式的自變數陣列。 StartService 函式會在建立新線程之後傳回,以執行 ServiceMain 函式。 服務控制程式可以呼叫 QueryServiceStatus 函式,擷取 SERVICE_STATUS 結構中新啟動服務的狀態。 初始化期間,dwCurrentState 成員應SERVICE_START_PENDING。 dwWaitHint 成員是時間間隔,以毫秒為單位,指出服務控制程式在再次呼叫 queryServiceStat us 之前應該等候的時間長度。 初始化完成時,服務會將 dwCurrentState 變更為 SERVICE_RUNNING。

服務控制管理員不支援在啟動時將自定義環境變數傳遞至服務。 此外,服務控制管理員不會偵測並傳遞變更給環境變數,因為服務正在執行。 不要讓服務相依於環境變數,而是使用登錄值或 ServiceMain 自變數。

以下是服務控制管理員啟動一般服務時所發生狀況的簡化概觀:

  • SCM 會從登錄讀取服務路徑,並準備啟動服務。 這包括取得服務鎖定。 在保留服務鎖定時啟動另一個服務的任何嘗試都會封鎖,直到服務鎖定解除為止。
  • SCM 會啟動進程,並等候子進程結束(表示失敗)或報告SERVICE_RUNNING狀態。
  • 應用程式會執行其非常簡單的初始化,並呼叫 StartServiceCtrlDispatcher 函式。
  • StartServiceCtrlDispatcher 會連線到服務控制管理員,並啟動第二個線程,呼叫服務的 ServiceMain 函式。 ServiceMain 應儘快報告SERVICE_RUNNING。
  • 當服務控制管理員通知服務正在執行時,它會釋放服務鎖定。

如果服務未在 80 秒內更新其狀態,加上最後一個等候提示,服務控制管理員會判斷服務已停止回應。 服務控制管理員會記錄事件並停止服務。

如果程式正在啟動驅動程式服務,StartService 在設備驅動器完成初始化之後傳回。

如需詳細資訊,請參閱 啟動服務