共用方式為


ControlServiceExA 函式 (winsvc.h)

將控件程式代碼傳送至服務。

語法

BOOL ControlServiceExA(
  [in]      SC_HANDLE hService,
  [in]      DWORD     dwControl,
  [in]      DWORD     dwInfoLevel,
  [in, out] PVOID     pControlParams
);

參數

[in] hService

服務的句柄。 此句柄是由 OpenServiceCreateService 函式所傳回。 此句柄所需的 訪問許可權 取決於所要求的 dwControl 程序代碼。

[in] dwControl

此參數可以是下列其中一個控件代碼。

控制程序代碼 意義
SERVICE_CONTROL_CONTINUE
0x00000003
通知暫停的服務應該繼續。 hService 句柄必須具有SERVICE_PAUSE_CONTINUE訪問許可權。
SERVICE_CONTROL_INTERROGATE
0x00000004
通知服務應該向服務控制管理員報告其目前的狀態資訊。 hService 句柄必須具有SERVICE_INTERROGATE訪問許可權。

請注意,此控件通常不是有用的,因為 SCM 知道服務的目前狀態。

SERVICE_CONTROL_NETBINDADD
0x00000007
通知網路服務有新的元件可供系結。 hService 句柄必須具有SERVICE_PAUSE_CONTINUE訪問許可權。 不過,此控件程式代碼已被取代;請改用隨插即用功能。
SERVICE_CONTROL_NETBINDDISABLE
0x0000000A
通知網路服務已停用其中一個系結。 hService 句柄必須具有SERVICE_PAUSE_CONTINUE訪問許可權。 不過,此控件程式代碼已被取代;請改用隨插即用功能。
SERVICE_CONTROL_NETBINDENABLE
0x00000009
通知網路服務已啟用已停用的系結。 hService 句柄必須具有SERVICE_PAUSE_CONTINUE訪問許可權。 不過,此控件程式代碼已被取代;請改用隨插即用功能。
SERVICE_CONTROL_NETBINDREMOVE
0x00000008
通知網路服務已移除系結的元件。 hService 句柄必須具有SERVICE_PAUSE_CONTINUE訪問許可權。 不過,此控件程式代碼已被取代;請改用隨插即用功能。
SERVICE_CONTROL_PARAMCHANGE
0x00000006
通知服務其啟動參數已變更。 hService 句柄必須具有SERVICE_PAUSE_CONTINUE訪問許可權。
SERVICE_CONTROL_PAUSE
0x00000002
通知服務應該暫停。 hService 句柄必須具有SERVICE_PAUSE_CONTINUE訪問許可權。
SERVICE_CONTROL_STOP
0x00000001
通知服務應該停止。 hService 句柄必須具有SERVICE_STOP訪問許可權。

將停止要求傳送至服務之後,您不應該將其他控件傳送至服務。

 

此參數也可以是使用者定義的控件程序代碼,如下表所述。

控制程序代碼 意義
範圍 128 到 255
服務會定義與控件程式代碼相關聯的動作。 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

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

傳回碼 描述
ERROR_ACCESS_DENIED
句柄沒有必要的訪問許可權。
ERROR_DEPENDENT_SERVICES_RUNNING
無法停止服務,因為其他執行中的服務相依於它。
ERROR_INVALID_HANDLE
使用 CreateServiceOpenService取得指定的句柄,或句柄不再有效。
ERROR_INVALID_PARAMETER
dwControl 參數中要求的控件程式代碼未定義,或 dwControl 為SERVICE_CONTROL_STOP,但 dwReasonpszCommentSERVICE_CONTROL_STATUS_REASON_PARAMS 結構的成員無效。
ERROR_INVALID_SERVICE_CONTROL
要求的控制程式代碼無效,或服務無法接受。
ERROR_SERVICE_CANNOT_ACCEPT_CTRL
要求的控制程式代碼無法傳送至服務,因為服務的狀態為SERVICE_STOPPED、SERVICE_START_PENDING或SERVICE_STOP_PENDING。
ERROR_SERVICE_NOT_ACTIVE
服務尚未啟動。
ERROR_SERVICE_REQUEST_TIMEOUT
服務的進程已啟動,但未呼叫 startServiceCtrlDispatcher,或呼叫 StartServiceCtrlDispatcher 的線程可能會封鎖在控制處理程式函式中。
ERROR_SHUTDOWN_IN_PROGRESS
系統正在關閉。

言論

ControlServiceEx 函式會要求服務控制管理員 (SCM) 將要求的控制程式碼傳送至服務。 如果服務已指定它接受程式碼,則 SCM 會傳送程式代碼,且處於可傳送控件程式代碼的狀態。

SCM 會以序列方式處理服務控制通知, 它會等候一個服務完成處理服務控制項通知,再傳送下一個服務。 因此,如果有任何服務忙於處理控件程式代碼,則呼叫 ControlServiceEx 區塊 30 秒。 如果忙碌服務在逾時到期時仍未從其處理程式函式傳回,ControlServiceEx 會失敗並出現ERROR_SERVICE_REQUEST_TIMEOUT。

若要停止和啟動服務,需要可讓您執行此動作的安全性描述項。 默認的安全性描述元可讓 LocalSystem 帳戶,以及 Administrators 和 Power Users 群組的成員停止和啟動服務。 若要變更服務的安全性描述元,請參閱 修改服務的 DACL

QueryServiceStatusEx 函式會傳回 SERVICE_STATUS_PROCESS 結構,其 dwCurrentStatedwControlsAccepted 成員表示執行中服務接受的目前狀態和控件。 所有執行中的服務預設都會接受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

另請參閱

CreateService

OpenService

QueryServiceStatusEx

SERVICE_CONTROL_STATUS_REASON_PARAMS

SERVICE_STATUS

服務控制要求

Service Functions

SetServiceObjectSecurity

SetServiceStatus