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在中间起连接作用。
如果没有这个函数的话,服务应用程序就不会退出的。
通过看一些书后自己的一点小见解,请多指教,如有错误,万望提出!
服务三个关键函数:程序入口函数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在中间起连接作用。
如果没有这个函数的话,服务应用程序就不会退出的。
通过看一些书后自己的一点小见解,请多指教,如有错误,万望提出!
相关文章推荐
- Exe服务程序一些理解
- 程序小白---关于封装、继承、抽象类和接口的一些理解。
- 微服务的一些理解
- 通过分析exevc系统调用处理过程来理解Linux内核如何装载和启动一个可执行程序
- 汇编语言中对PSP区和程序区的一些理解
- 我对在开发板上开发程序的一些理解
- 将NServiceBus.Host.exe程序变成本地服务
- 用instsrv将普通exe程序注册为服务
- Visual Studio 2017中使用正则修改部分内容 如何使用ILAsm与ILDasm修改.Net exe(dll)文件 C#学习-图解教程(1):格式化数字字符串 小程序开发之图片转Base64(C#、.Net) jquery遍历table为每一个单元格取值及赋值 。net加密解密相关方法 .net关于坐标之间一些简单操作
- 白话讲山寨SOA,少一些迷惑、多一些理解,你的程序架构SOA了吗?
- 关于spark程序动态资源分配的一些理解
- 学习Java程序制作Jar、exe和安装包过程中的问题记录及理解
- 我对在开发板上开发程序的一些理解
- Exe程序注册成系统服务.
- C#创建服务及使用程序自动安装服务,.NET创建一个即是可执行程序又是Windows服务的exe(转)
- 程序安装.net服务(不使用InstallUtil.exe)
- c#写服务、exe 可执行程序、windows锁屏的过程中遇到的问题
- exe程序作为WINDOWS服务显示界面启动方法
- 白话讲山寨SOA,少一些迷惑、多一些理解,你的程序架构SOA了吗?
- 关于C程序运行时的内存 的一些理解