RegisterServiceCtrlHandler函数注册一个函数来处理服务的服务控制请求。
SERVICE_STATUS_HANDLE RegisterServiceCtrlHandler(
LPCTSTR 【lpServiceName】, | //服务名称的地址 |
LPHANDLER_FUNCTION 【lpHandlerProc】 | //处理函数的地址 |
); |
参数
【lpServiceName】
指向以空字符结尾的字符串,命名由调用线程运行的服务。这是在创建服务时在CreateService功能中指定的服务名称。
【lpHandlerProc】
指向要注册的处理器功能。
返回值
如果函数成功,则返回值是服务状态句柄。
如果函数失败,返回值为零。要获取扩展错误信息,请调用GetLastError.
错误
服务控制管理器可以设置以下错误代码。其他错误代码可以由服务控制管理器调用的注册表函数设置。
值 | 含义 |
ERROR_INVALID_NAME | 指定的服务名称无效。 |
ERROR_SERVICE_DOES_NOT_EXIST | 指定的服务不存在。 |
备注
新服务的ServiceMain功能应立即调用RegisterServiceCtrlHandler函数,以通过控制调度程序注册控制处理功能。这使得控制分派器在接收到对该服务的控制请求时调用指定的功能。调用进程的线程可以使用此函数返回的服务状态句柄来识别在后续调用SetServiceStatus函数中的服务。
必须在第一个SetServiceStatus调用之前调用此函数,因为它返回一个服务状态句柄以供调用者使用,以便其他服务不会无意中设置该服务的状态,由服务控制管理器维护。它还需要在第一个SetServiceStatus之前调用,以便在服务指定通过SetServiceStatus函数接受的控件时,控制处理程序就位于现场控制请求。
当使用控制请求调用控制处理函数时,不管服务状态是否发生变化,都必须调用SetServiceStatus通知服务控制管理器的最新状态。
服务状态句柄不必关闭。
也可以看看