您的位置:首页 > 其它

Exe服务程序一些理解

2012-04-15 22:01 190 查看
Exe作为服务程序

服务三个关键函数:程序入口函数main()或WinMain();服务入口函数ServiceMain;服务控制函数Handler;

Main函数:任何程序的入口函数,在程序启动时被调用;在这里调用一个函数StartServiceCtrlDispatcher,main函数(主线程)在被SCM启动时(对,可以被SCM启动),主线程会调用这个函数来分发服务,这个函数把服务进程的主线程和SCM联结起来,一直到所有服务线程(一个或者几个ServiceMain函数)都结束才返回,SCM用这个联结来向主线程(main)来发送一个控制或者一个要求服务开始的请求,当SCM发送一个开启一个新服务的要求时,主线程就要开启一个新的线程来执行一个ServiceMain;当SCM发送一个控制服务的要求时,比如要停止一个服务时、把一个已经停止的服务再开启时、暂停一个服务时等,主线程会调用Handler来响应SCM的要求,好像是ServiceMain和Handler是由系统SCM直接调用的那样,其实是主线程main在起联结作用,才带动了ServiceMain和
Handler函数的运行。一个ServiceMain对应一个线程也是正确的。

StartServiceCtrlDispatcher另外,这个函数是不返回的,也就是把main主函数堵塞了,一直在等待和SCM通信,接受SCM发送的请求。在处理SCM请求时调用Handler;在此前是激发ServiceMain服务主线程,这是此函数两个作用。

ServiceMain:

服务入口函数会立即调用函数RegisterServiceCtrlHandlerEx注册一个服务控制函数Handler,然后调用函数SetServiceStatus来向SCM报告服务的状态,报告服务的状态是很重要的,SetServiceStatus函数用到的结构体SERVICE_STATUS,这个结构体的一个内部成员变量dwControlsAccepted会告诉SCM本服务可以受到的哪些控制,比如这个参数是SERVICE_ACCEPT_PAUSE_CONTINUE,那在前面注册的Handler函数中就能响应暂停和继续控制,SetServiceStatus函数不只是告知SCM服务当时的状态,还起到告诉SCM服务受控制的程度。

到这个时候,ServiceMain会做一些该做的事,比如监视一个进程是不是结束,或者弹出一个MessageBox来通知用户,这些事情都是由服务的编写者决定的;并且ServiceMain会调用WaitForSingleObject一等待Handler函数来发送一个全局的事件信号event,比如说服务停止,当收到这个信号时ServiceMain函数就会结束自己所在的线程并退出;这时如果想在ServiceMain中来一直执行一个监视进程的工作,就要用一个死循环和Sleep函数是一个不错的决定了。

ServiceMain返回的时候就是服务结束的时候,所以对于在内存常驻的服务(不常驻, //设计成服务也就没有意义了),不能立即返回,一个比较常用的方法是建立事件,然 //后调用WaitForSingleObject等待事件的触发。在收到SERVICE_CONTROL_STOP请求之后,调用SetEvent触发事件,ServiceMain返回,服务结束。

Handler:服务控制处理函数Handler是由ServiceMain执行后立即注册成的,控制分发器(基本上算是main主函数)在一收到SCM发送的请求时就会调用Handler函数,控制处理函数Handler就会相应处理SCM的要求,处理完成后一定要调用SetServiceStatus来向SCM报告服务状态。

一个服务程序操作:一个当作服务程序的A.Exe编写成了,但是要创建一个执行这个Exe的服务,要用CreateService函数,也就是用B.exe来创建启动A.exe的服务;服务的删除和重新启动、暂停、关机等可由第三方服务工具和Handler来配合完成,当然SCM在中间起连接作用。

如果没有这个函数的话,服务应用程序就不会退出的。

通过看一些书后自己的一点小见解,请多指教,如有错误,万望提出!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐