VC++ Service编程(六)Control Handler函数

来源:互联网 发布:网络和ip地址计算 编辑:程序博客网 时间:2024/06/08 18:42

Control Handler函数

    每个服务都有一个控制处理器,HandlerEx函数。当服务程序从一个服务控制程序那里收到一个控制请求时,HandlerEx函数就会被控制调度器调用。因此,这个函数运行在控制调度器的环境中。服务调用RegisterServiceCtrlHandler或者RegisterServiceCtrlHandlerEx函数来注册它的Control Handler(控制处理器)函数。
    任何时间调用HandlerEx,服务必须调用SetServiceStatus函数,向SCM(服务控制管理器)报告当前状态。不管状态改变与否,都必须这么做。
    服务控制程序可以利用ControlService来发送控制请求。所有的服务都必须接收并处理SERVICE_CONTROL_INTERROGATE控制码。你可以调用SetServiceStatus来设定接不接收其它的控制代码。要接收SERVICE_CONTROL_DEVICEEVENT控制码,你必须调用RegisterDeviceNotification函数。服务亦可以处理额外的用户定义的控制码。
    控制处理器必须在30秒内返回,否则SCM会返回一个错误。如果控制处理器在运行的同时,服务需要做一个较长的处理,就应该创建一个新的线程来做这个处理,然后返回。举个例子,长时间处理一个停止请求,创建一个新的线程来处理这个停止操作。控制处理器应该调用SetServiceStatus函数发送SERVICE_STOP_PENDING消息,然后返回。
    当用户关闭系统的时候,所有用SERVICE_ACCEPT_SHUTDOWN控制码调用过SetServiceStatus的控制处理器,都会收到SERVICE_CONTROL_SHUTDOWN控制码。所有的这些服务都会按照他们在已安装服务数据库中的顺序被通知到。在系统关闭之前,一个服务有大概20秒的默认时间来进行清理工作。这段时间过后,不管服务是否已经完全关闭,系统都会关闭。注意,如果系统进入关闭状态(不是重新启动或者电源关闭),服务继续运行。
    如果服务需要更多时间用来清理,它发送一个STOP_PENDING消息和一个等待时间,这样,服务控制器就知道要等多长时间,然后再向系统报告服务关闭完成。尽管这样,服务控制器等待的时间也是有限度的。可以更改注册表项HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControl中的WaitToKillServiceTimeout值来改变这个时间限制。
    顾客要求操作系统快速关闭。举个例子,使用UPS电源运转的计算机如果不在UPS能源耗尽之前关闭完,数据就会丢失。所以,服务应该尽可能快地完成清理工作。将为保存数据减到最少,在关闭时至保存为保存的数据是个好习惯。因为计算机正在关闭,千万不要在释放内存或别的系统资源上浪费时间。如果你要向服务器通知这在退出,把等待返回的时间减到最小,因为网络问题也有可能耽误你的服务关闭。
   注意,服务关闭过程中,SCM不会考虑从属关系。SCM注意清点正在运行的服务,并向它们发送SERVICE_CONTROL_SHUTDOWN命令。因此,一个服务可能会因另一个服务已经中止而运行失败。利用SetProcessShutdownParameters函数,来设置从属服务的关闭顺序。SCM通过这个函数给它的处理器赋予0x1E0优先级;当它的控制处理器被调用,SCM就发送SERVICE_CONTROL_SHUTDOWN通知,同时等待这些服务退出,然后从控制处理器里返回。
0 0
原创粉丝点击