注册用于处理扩展服务控制请求的函数。
语法
SERVICE_STATUS_HANDLE RegisterServiceCtrlHandlerExA(
[in] LPCSTR lpServiceName,
[in] LPHANDLER_FUNCTION_EX lpHandlerProc,
[in, optional] LPVOID lpContext
);
参数
[in] lpServiceName
由调用线程运行的服务的名称。 这是创建服务时,CreateService 函数中指定的服务控制程序的服务名称。
[in] lpHandlerProc
指向要注册的处理程序函数的指针。 有关详细信息,请参阅 HandlerEx。
[in, optional] lpContext
任何用户定义的数据。 此参数传递给处理程序函数有助于在多个服务共享进程时标识服务。
返回值
如果函数成功,则返回值为服务状态句柄。
如果函数失败,则返回值为零。 若要获取扩展的错误信息,请调用 GetLastError。
服务控制管理器可以设置以下错误代码。
| 返回代码 | 描述 |
|---|---|
|
内存不足,无法将 ANSI 字符串参数转换为 Unicode。 Unicode 字符串参数不会发生此错误。 |
|
当进程调用 StartServiceCtrlDispatcher 函数时,服务条目被错误地指定。 |
言论
新服务的 ServiceMain 函数应立即调用 RegisterServiceCtrlHandlerEx 函数,以便向控制调度程序注册控制处理程序函数。 这使控制调度程序能够在接收此服务的控件请求时调用指定的函数。 有关可能的控制代码列表,请参阅 HandlerEx。 调用进程的线程可以使用此函数返回的服务状态句柄在对 SetServiceStatus 函数的后续调用中标识服务。
RegisterServiceCtrlHandlerEx 函数必须在第一 SetServiceStatus 调用之前调用,因为 RegisterServiceCtrlHandlerEx 返回调用方要使用的服务状态句柄,以便其他服务无法无意中设置此服务状态。 此外,在服务指定通过 SetServiceStatus 函数
当使用控制请求调用控制处理程序函数时,服务必须调用 SetServiceStatus 才能将状态报告给服务控制管理器,前提是服务状态已更改,例如服务正在处理停止或关闭控件时。 如果服务状态未更改,服务不应向服务控制管理器报告状态。
服务状态句柄不必关闭。
注意
winsvc.h 标头将 RegisterServiceCtrlHandlerEx 定义为一个别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。 将中性编码别名与不中性编码的代码混合使用可能会导致编译或运行时错误不匹配。 有关详细信息,请参阅函数原型的
要求
| 要求 | 价值 |
|---|---|
| 最低支持的客户端 | Windows XP [仅限桌面应用] |
| 支持的最低服务器 | Windows Server 2003 [仅限桌面应用] |
| 目标平台 | 窗户 |
| 标头 | winsvc.h (包括 Windows.h) |
| 库 | Advapi32.lib |
| DLL | Advapi32.dll |