共用方式為


RegisterServiceCtrlHandlerA 函式 (winsvc.h)

註冊函式來處理服務控制要求。

此函式已由 RegisterServiceCtrlHandlerEx 函式取代。 服務可以使用任一函式,但新函式支援使用者定義的內容數據,而新的處理程式函式則支援額外的擴充控制程式碼。

語法

SERVICE_STATUS_HANDLE RegisterServiceCtrlHandlerA(
  [in] LPCSTR             lpServiceName,
  [in] LPHANDLER_FUNCTION lpHandlerProc
);

參數

[in] lpServiceName

呼叫線程所執行之服務的名稱。 這是建立服務時,CreateService 函式中指定的服務控制程式的服務名稱。

如果服務類型是SERVICE_WIN32_OWN_PROCESS,則函式不會驗證指定的名稱是否有效,因為進程中只有一個已註冊的服務。

[in] lpHandlerProc

要註冊之處理程式函式的指標。 如需詳細資訊,請參閱 Handler

傳回值

如果函式成功,傳回值就是服務狀態句柄。

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

服務控制管理員可以設定下列錯誤碼。

傳回碼 描述
ERROR_NOT_ENOUGH_MEMORY
記憶體不足,無法將 ANSI 字串參數轉換成 Unicode。 Unicode 字串參數不會發生此錯誤。
ERROR_SERVICE_NOT_IN_EXE
呼叫 startServiceCtrlDispatcher 函式的程式時,未正確指定服務專案。

言論

新服務的 ServiceMain 函式應立即呼叫 RegisterServiceCtrlHandler 函式,向控件發送器註冊控件處理程式函式。 這可讓控件發送器在收到此服務的控制項要求時叫用指定的函式。 如需可能的控制程式碼清單,請參閱 Handler。 呼叫進程的線程可以使用此函式傳回的服務狀態句柄,在後續呼叫 setServiceStatus 函式時識別服務。

RegisterServiceCtrlHandler 函式必須在第一個 SetServiceStatus 呼叫之前呼叫,因為 RegisterServiceCtrlHandler 會傳回呼叫者使用的服務狀態句柄,讓其他服務無法不小心設定此服務狀態。 此外,控件處理程式必須在服務指定它透過 setServiceStatus 函式所接受的控件時,就已就地接收控制要求。

使用控件要求叫用控件處理程式函式時,服務必須呼叫 SetServiceStatus,才能在服務狀態變更時向服務控制管理員報告狀態,例如當服務正在處理停止或關機控件時。 如果服務狀態尚未變更,服務不應該向服務控制管理員報告狀態。

服務狀態句柄不需要關閉。

例子

如需範例,請參閱 撰寫 ServiceMain 函式

注意

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

要求

要求 價值
最低支援的用戶端 Windows XP [僅限傳統型應用程式]
支援的最低伺服器 Windows Server 2003 [僅限傳統型應用程式]
目標平臺 窗戶
標頭 winsvc.h (包括 Windows.h)
連結庫 Advapi32.lib
DLL Advapi32.dll

另請參閱

CreateService

處理程式

RegisterServiceCtrlHandlerEx

服務控制處理程式函式

Service Functions

ServiceMain

SetServiceStatus