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 ServiceMain 函式做為自變數的 null 終止字串。 如果沒有自變數,此參數可以是 NULL。 否則,第一個自變數 (lpServiceArgVectors[0]) 是服務的名稱,後面接著任何其他自變數 (lpServiceArgVectors[1] 到 lpServiceArgVectors[dwNumServiceArgs-1])。
驅動程式服務不會收到這些自變數。
傳回值
如果函式成功,則傳回值為非零值。
如果函式失敗,傳回值為零。 若要取得擴充的錯誤資訊,請呼叫 GetLastError。
服務控制管理員可以設定下列錯誤碼。 其他可由服務控制管理員呼叫的登錄函式設定。
傳回碼 | 描述 |
---|---|
|
句柄沒有SERVICE_START訪問許可權。 |
|
句柄無效。 |
|
找不到服務二進位檔。 |
|
服務的實例已經執行中。 |
|
資料庫已鎖定。 |
|
此服務取決於不存在或已標示要刪除的服務。 |
|
此服務相依於另一個無法啟動的服務。 |
|
服務已停用。 |
|
服務因為登入失敗而未啟動。 如果服務設定為在沒有「以服務登入」許可權的帳戶下執行,就會發生此錯誤。 |
|
服務已標示為要刪除。 |
|
無法為服務建立線程。 |
|
服務的進程已啟動,但未呼叫 startServiceCtrlDispatcher |
言論
啟動驅動程式服務時,StartService 函式不會傳回,直到設備驅動器完成初始化為止。
啟動服務時,服務控制管理員 (SCM) 會在必要時繁衍服務進程。 如果指定的服務與其他服務共享進程,則必要的進程可能已經存在。 StartService 函式不會等候新服務的第一個狀態更新,因為可能需要一段時間。 相反地,當 SCM 收到來自服務控制發送器通知時,它會傳回此服務成功建立 ServiceMain 線程。
SCM 會先設定下列默認狀態值,再從 startService 傳回:
- 服務的目前狀態會設定為 SERVICE_START_PENDING。
- 接受的控件會設定為 none (零)。
- 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 [僅限傳統型應用程式] |
目標平臺 | 窗戶 |
標頭 | winsvc.h (包括 Windows.h) |
連結庫 | Advapi32.lib |
DLL | Advapi32.dll |