ControlServiceExA 函式 (winsvc.h)
將控件程式代碼傳送至服務。
語法
BOOL ControlServiceExA(
[in] SC_HANDLE hService,
[in] DWORD dwControl,
[in] DWORD dwInfoLevel,
[in, out] PVOID pControlParams
);
參數
[in] hService
服務的句柄。 此句柄是由 OpenService 或 CreateService 函式所傳回。 此句柄所需的 訪問許可權 取決於所要求的 dwControl 程序代碼。
[in] dwControl
此參數可以是下列其中一個控件代碼。
此參數也可以是使用者定義的控件程序代碼,如下表所述。
控制程序代碼 | 意義 |
---|---|
|
服務會定義與控件程式代碼相關聯的動作。 hService 句柄必須具有SERVICE_USER_DEFINED_CONTROL訪問許可權。 |
[in] dwInfoLevel
服務控件參數的信息層級。 此參數必須設定為 SERVICE_CONTROL_STATUS_REASON_INFO (1)。
[in, out] pControlParams
服務控件參數的指標。 如果 dwInfoLevel 是SERVICE_CONTROL_STATUS_REASON_INFO,則此成員是 SERVICE_CONTROL_STATUS_REASON_PARAMS 結構的指標。
傳回值
如果函式成功,則傳回值為非零值。
如果函式失敗,傳回值為零。 若要取得擴充的錯誤資訊,請呼叫 GetLastError。
服務控制管理員可以設定下列錯誤碼。 服務控制管理員所呼叫的登錄函式可以設定其他錯誤碼。
傳回碼 | 描述 |
---|---|
|
句柄沒有必要的訪問許可權。 |
|
無法停止服務,因為其他執行中的服務相依於它。 |
|
未 使用 CreateService 或 OpenService取得指定的句柄,或句柄不再有效。 |
|
dwControl 參數中要求的控件程式代碼未定義,或 dwControl 為SERVICE_CONTROL_STOP,但 dwReason 或 pszCommentSERVICE_CONTROL_STATUS_REASON_PARAMS 結構的成員無效。 |
|
要求的控制程式代碼無效,或服務無法接受。 |
|
要求的控制程式代碼無法傳送至服務,因為服務的狀態為SERVICE_STOPPED、SERVICE_START_PENDING或SERVICE_STOP_PENDING。 |
|
服務尚未啟動。 |
|
服務的進程已啟動,但未呼叫 startServiceCtrlDispatcher |
|
系統正在關閉。 |
言論
ControlServiceEx 函式會要求服務控制管理員 (SCM) 將要求的控制程式碼傳送至服務。 如果服務已指定它接受程式碼,則 SCM 會傳送程式代碼,且處於可傳送控件程式代碼的狀態。
SCM 會以序列方式處理服務控制通知, 它會等候一個服務完成處理服務控制項通知,再傳送下一個服務。 因此,如果有任何服務忙於處理控件程式代碼,則呼叫 ControlServiceEx 區塊 30 秒。 如果忙碌服務在逾時到期時仍未從其處理程式函式傳回,ControlServiceEx 會失敗並出現ERROR_SERVICE_REQUEST_TIMEOUT。
若要停止和啟動服務,需要可讓您執行此動作的安全性描述項。 默認的安全性描述元可讓 LocalSystem 帳戶,以及 Administrators 和 Power Users 群組的成員停止和啟動服務。 若要變更服務的安全性描述元,請參閱 修改服務的 DACL。
QueryServiceStatusEx 函式會傳回 SERVICE_STATUS_PROCESS 結構,其 dwCurrentState 和 dwControlsAccepted 成員表示執行中服務接受的目前狀態和控件。 所有執行中的服務預設都會接受SERVICE_CONTROL_INTERROGATE控件程序代碼。 驅動程式不接受SERVICE_CONTROL_STOP和SERVICE_CONTROL_INTERROGATE以外的控制碼。 每個服務都會指定它呼叫 SetServiceStatus 函式來報告其狀態時所接受的其他控件代碼。 無論正在執行什麼,服務都應該一律接受這些程序代碼。
下表顯示每個可能服務狀態中 SCM 的動作。
服務狀態 | 停 | 其他控制件 |
---|---|---|
停止 | (c) | (c) |
STOP_PENDING | (b) | (b) |
START_PENDING | (a) | (b) |
運行 | (a) | (a) |
CONTINUE_PENDING | (a) | (a) |
PAUSE_PENDING | (a) | (a) |
暫停 | (a) | (a) |
- (a)
- 如果服務接受此控制程式代碼,請將要求傳送至服務;否則,ControlServiceEx 會傳回零,GetLastError 會傳回 ERROR_INVALID_SERVICE_CONTROL。
- (b)
- 服務不是可以傳送控件的狀態,因此 ControlServiceEx 傳回零,GetLastError 傳回 ERROR_SERVICE_CANNOT_ACCEPT_CTRL。
- (c)
- 服務不是使用中,因此 ControlServiceEx 會傳回零,GetLastError 會傳回 ERROR_SERVICE_NOT_ACTIVE。
注意
winsvc.h 標頭會根據 UNICODE 預處理器常數的定義,將 ControlServiceEx 定義為自動選取此函式的 ANSI 或 Unicode 版本。 混合使用編碼中性別名與非編碼中性的程序代碼,可能會導致編譯或運行時間錯誤不符。 如需詳細資訊,請參閱函式原型的
要求
要求 | 價值 |
---|---|
最低支援的用戶端 | Windows Vista [僅限傳統型應用程式] |
支援的最低伺服器 | Windows Server 2008 [僅限傳統型應用程式] |
目標平臺 | 窗戶 |
標頭 | winsvc.h (包括 Windows.h) |
連結庫 | Advapi32.lib |
DLL | Advapi32.dll |