StartServiceA 函式 (winsvc.h)
啟動服務。
語法
BOOL StartServiceA(
[in] SC_HANDLE hService,
[in] DWORD dwNumServiceArgs,
[in, optional] LPCSTR *lpServiceArgVectors
);
參數
[in] hService
服務的控制碼。 這個控制碼是由 OpenService 或 CreateService 函式所傳回,而且必須具有SERVICE_START存取權限。 如需詳細資訊,請參閱 服務安全性和存取權限。
[in] dwNumServiceArgs
lpServiceArgVectors陣列中的字串數目。 如果 lpServiceArgVectors 為 Null,這個參數可以是零。
[in, optional] lpServiceArgVectors
要傳遞至 ServiceMain 函式做為引數的 Null 終止字串。 如果沒有引數,這個參數可以是 Null。 否則,第一個引數 (lpServiceArgVectors[0]) 是服務的名稱,後面接著任何其他引數 (lpServiceArgVectors[1] 到 lpServiceArgVectors[dwNumServiceArgs-1]) 。
驅動程式服務不會收到這些引數。
傳回值
如果函式成功,則傳回非零的值。
如果此函式失敗,則傳回值為零。 若要取得擴充的錯誤資訊,請呼叫 GetLastError。
服務控制管理員可以設定下列錯誤碼。 其他功能可由服務控制管理員所呼叫的登錄函式設定。
傳回碼 | 描述 |
---|---|
|
控制碼沒有SERVICE_START存取權限。 |
|
控制代碼無效。 |
|
找不到服務二進位檔案。 |
|
服務的實例已在執行中。 |
|
資料庫已鎖定。 |
|
此服務取決於不存在或已標示為要刪除的服務。 |
|
服務相依于另一個無法啟動的服務。 |
|
服務已停用。 |
|
登入失敗,因此服務無法啟動。 如果服務設定為在沒有「以服務登入」許可權的帳戶下執行,就會發生此錯誤。 |
|
服務已標示為要刪除。 |
|
無法為服務建立執行緒。 |
|
服務的進程已啟動,但未呼叫 StartServiceCtrlDispatcher,或呼叫 StartServiceCtrlDispatcher 的執行緒可能會在控制項處理常式函式中遭到封鎖。 |
備註
啟動驅動程式服務時, StartService 函式不會在設備磁碟機完成初始化之前傳回。
啟動服務時,服務控制管理員會視需要 (SCM) 繁衍服務程式。 如果指定的服務與其他服務共用進程,則必要的進程可能已經存在。 StartService函式不會等候新服務的第一個狀態更新,因為它可能需要一段時間。 相反地,當 SCM 收到來自服務控制發送器的通知,指出已成功建立此服務的 ServiceMain 執行緒時,它會傳回 。
SCM 會先設定下列預設狀態值,再從 StartService傳回:
- 服務的目前狀態會設定為 SERVICE_START_PENDING。
- 接受的控制項設定為無 (零) 。
- CheckPoint 值設定為零。
- WaitHint 時間會設定為 2 秒。
服務無法在初始化期間呼叫 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 |