服務啟動

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

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

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

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

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

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

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

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