StartServiceA 函式 (winsvc.h)

啟動服務。

語法

BOOL StartServiceA(
  [in]           SC_HANDLE hService,
  [in]           DWORD     dwNumServiceArgs,
  [in, optional] LPCSTR    *lpServiceArgVectors
);

參數

[in] hService

服務的控制碼。 這個控制碼是由 OpenServiceCreateService 函式所傳回,而且必須具有SERVICE_START存取權限。 如需詳細資訊,請參閱 服務安全性和存取權限

[in] dwNumServiceArgs

lpServiceArgVectors陣列中的字串數目。 如果 lpServiceArgVectors 為 Null,這個參數可以是零。

[in, optional] lpServiceArgVectors

要傳遞至 ServiceMain 函式做為引數的 Null 終止字串。 如果沒有引數,這個參數可以是 Null。 否則,第一個引數 (lpServiceArgVectors[0]) 是服務的名稱,後面接著任何其他引數 (lpServiceArgVectors[1] 到 lpServiceArgVectors[dwNumServiceArgs-1]) 。

驅動程式服務不會收到這些引數。

傳回值

如果函式成功,則傳回非零的值。

如果此函式失敗,則傳回值為零。 若要取得擴充的錯誤資訊,請呼叫 GetLastError

服務控制管理員可以設定下列錯誤碼。 其他功能可由服務控制管理員所呼叫的登錄函式設定。

傳回碼 描述
ERROR_ACCESS_DENIED
控制碼沒有SERVICE_START存取權限。
ERROR_INVALID_HANDLE
控制代碼無效。
ERROR_PATH_NOT_FOUND
找不到服務二進位檔案。
ERROR_SERVICE_ALREADY_RUNNING
服務的實例已在執行中。
ERROR_SERVICE_DATABASE_LOCKED
資料庫已鎖定。
ERROR_SERVICE_DEPENDENCY_DELETED
此服務取決於不存在或已標示為要刪除的服務。
ERROR_SERVICE_DEPENDENCY_FAIL
服務相依于另一個無法啟動的服務。
ERROR_SERVICE_DISABLED
服務已停用。
ERROR_SERVICE_LOGON_FAILED
登入失敗,因此服務無法啟動。 如果服務設定為在沒有「以服務登入」許可權的帳戶下執行,就會發生此錯誤。
ERROR_SERVICE_MARKED_FOR_DELETE
服務已標示為要刪除。
ERROR_SERVICE_NO_THREAD
無法為服務建立執行緒。
ERROR_SERVICE_REQUEST_TIMEOUT
服務的進程已啟動,但未呼叫 StartServiceCtrlDispatcher,或呼叫 StartServiceCtrlDispatcher 的執行緒可能會在控制項處理常式函式中遭到封鎖。

備註

啟動驅動程式服務時, StartService 函式不會在設備磁碟機完成初始化之前傳回。

啟動服務時,服務控制管理員會視需要 (SCM) 繁衍服務程式。 如果指定的服務與其他服務共用進程,則必要的進程可能已經存在。 StartService函式不會等候新服務的第一個狀態更新,因為它可能需要一段時間。 相反地,當 SCM 收到來自服務控制發送器的通知,指出已成功建立此服務的 ServiceMain 執行緒時,它會傳回 。

SCM 會先設定下列預設狀態值,再從 StartService傳回:

  • 服務的目前狀態會設定為 SERVICE_START_PENDING。
  • 接受的控制項設定為無 (零) 。
  • CheckPoint 值設定為零。
  • WaitHint 時間會設定為 2 秒。
呼叫進程可以透過定期呼叫 QueryServiceStatus 函式來查詢服務的狀態,判斷新服務是否已完成初始化。

服務無法在初始化期間呼叫 StartService 。 原因是 SCM 會在初始化期間鎖定服務控制資料庫,因此 對 StartService 的呼叫將會封鎖。 服務向 SCM 回報已成功啟動之後,就可以呼叫 StartService

如同 ControlService,如果有任何服務忙碌處理控制項程式碼, StartService 將會封鎖 30 秒。 如果忙碌服務在逾時到期時仍然未從其處理常式函式傳回, StartService 會失敗並ERROR_SERVICE_REQUEST_TIMEOUT。 這是因為 SCM 一次只會處理一個服務控制通知。

範例

如需範例,請參閱 啟動服務

注意

winsvc.h 標頭會將 StartService 定義為別名,根據 UNICODE 預處理器常數的定義,自動選取此函式的 ANSI 或 Unicode 版本。 混合使用編碼中性別名與非編碼中性的程式碼,可能會導致編譯或執行時間錯誤不符。 如需詳細資訊,請參閱 函式原型的慣例

規格需求

   
最低支援的用戶端 Windows XP [僅限傳統型應用程式]
最低支援的伺服器 Windows Server 2003 [僅限桌面應用程式]
目標平台 Windows
標頭 winsvc.h (包含 Windows.h)
程式庫 Advapi32.lib
Dll Advapi32.dll

另請參閱

ControlService

CreateService

DeleteService

OpenService

QueryServiceDynamicInformation

QueryServiceStatusEx

服務函式

服務啟動

ServiceMain