LPHANDLER_FUNCTION回调函数 (winsvc.h)
与 RegisterServiceCtrlHandler 函数一起使用的应用程序定义的回调函数。 服务程序可以使用它作为特定服务的控制处理程序函数。
LPHANDLER_FUNCTION类型定义指向此函数的指针。 Handler 是应用程序定义名称的占位符。
此函数已被与 RegisterServiceCtrlHandlerEx 函数一起使用的 HandlerEx 控件处理程序函数所取代。 服务可以使用任一控件处理程序,但新的控件处理程序支持用户定义的上下文数据和附加的扩展控制代码。
语法
LPHANDLER_FUNCTION LphandlerFunction;
void LphandlerFunction(
DWORD dwControl
)
{...}
参数
dwControl
返回值
无
备注
服务启动时,其 ServiceMain 函数应立即调用 RegisterServiceCtrlHandler 函数,以指定 处理程序 函数来处理控制请求。
服务进程的main线程中的控件调度程序每当从服务控制管理器接收控件请求时,都会为指定服务调用控件处理程序函数。 处理控制请求后,如果服务状态发生更改,控件处理程序必须调用 SetServiceStatus 函数,以便向服务控制管理器报告其新状态。
控制处理程序函数旨在接收通知并立即返回。 回调函数应保存其参数并创建其他线程以执行其他工作。 (应用程序必须确保此类线程在停止 service 之前已退出。) 具体而言,控制处理程序应避免可能阻止的操作(例如锁定),因为这可能会导致死锁或导致系统停止响应。
当服务控制管理器向服务发送控制代码时,它会等待处理程序函数返回,然后再将其他控制代码发送到其他服务。 控件处理程序应尽快返回;如果 SCM 在 30 秒内未返回,则返回错误。 如果服务在执行控件处理程序时服务必须执行冗长处理,它应创建一个辅助线程来执行冗长处理,然后从控件处理程序返回。 这可以防止服务将控制调度程序与控制调度程序关联起来,并阻止其他服务接收控制代码。
SERVICE_CONTROL_SHUTDOWN控制代码只能由在关闭期间必须绝对清理的服务进行处理,因为服务关闭) (大约 20 秒的时间有限。 在此时间到期后,无论服务关闭是否完成,系统关闭都会继续。 请注意,如果系统保持关闭状态 (未重启或关闭) ,则服务将继续运行。 如果服务注册接受 SERVICE_CONTROL_SHUTDOWN,它必须处理控制代码并及时停止。 否则,服务可能会增加关闭系统所需的时间,因为系统必须等待服务关闭所允许的全部时间后,系统才能继续关闭。
如果服务需要更多时间来清理,它应发送 STOP_PENDING 状态消息以及等待提示,以便服务控制器知道在向系统报告服务关闭已完成之前需要等待多长时间。 但是,为了防止服务停止关闭,服务控制器的等待时间有限制。 如果通过“服务”管理单元关闭服务,则限制为 125 秒。 如果操作系统正在重新启动,将在以下注册表项的 WaitToKillServiceTimeout 值中指定时间限制:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control
服务还可以使用 SetConsoleCtrlHandler 函数接收关闭通知。 当正在运行的应用程序关闭(在关闭服务之前发生)时,会收到此通知。
示例
有关示例,请参阅 编写控件处理程序函数。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows XP [仅限桌面应用] |
最低受支持的服务器 | Windows Server 2003 [仅限桌面应用] |
目标平台 | Windows |
标头 | winsvc.h (包括 Windows.h) |