如何编写一个Windows服务(一)-研发中心.doc_第1页
如何编写一个Windows服务(一)-研发中心.doc_第2页
如何编写一个Windows服务(一)-研发中心.doc_第3页
如何编写一个Windows服务(一)-研发中心.doc_第4页
如何编写一个Windows服务(一)-研发中心.doc_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

如何编写一个Windows服务(一)在Windows中,服务是一个特殊的程序,由服务管理器进行管理,允许在用户尚未登录的时候就启动。如果该程序意外终止,服务管理器会尝试重新启动该程序。那么,如何写一个Windows服务呢?如果我想在Windows服务中使用Qt又要怎么做呢?1.写一个服务的main函数众所周知,C+程序以main函数作为程序的入口。如果想要写一个服务,也需要一个函数作为服务程序的入口。这个函数与main函数的定义是一样的:void WINAPI service_main(int argc, char* argv);是的,写上这么一个函数作为服务的主函数就好了,函数内部无论你想做什么都可以。不过,因为我们写的是服务,所以一些和服务相关的功能我们应该注意:作为一个服务,告诉服务管理器自身的状态以及接受服务管理器的控制是最基本的吧。所以,一般情况下,我们会在服务的main函数中写上这么两个功能:注册一个服务管理函数,以及告知服务管理器自身已经启动了。1.1.注册服务管理函数服务管理函数的声明是这样的:void WINAPI ServiceHandler(DWORD fdwControl);该函数的功能是,Windows的服务管理器会根据系统需要与用户的操作向服务发送一些请求,服务需要相应这些请求。其中,请求的类型就是这个函数的参数。知道了这个原理,那么我们一般情况下就会这么实现这个函数:switch语句很好理解,case中的宏定义也能很轻松的明白是什么意思。其中,ServiceStatus是一个“全局”的结构体,其定义如下:SERVICE_STATUS ServiceStatus;也就是说,对于这个例子来说,我们只会响应服务管理器的停止与关闭消息,被粉色矩形框住的代码就是我们自己的程序退出逻辑毕竟有些程序并不能直接的就被中止了,例如例子中,一旦服务器被关闭就会写入一个log。好了,我们已经有了服务的管理函数,那么如何让服务管理器知道我们的服务有这么一个管理函数呢?只需要使用以下方式即可:hServiceStatusHandle = RegisterServiceCtrlHandler(TEXT(SERVICE_NAME), ServiceHandler);这个函数返回的就是服务状态句柄,以后想要控制或设置服务的状态,使用这个句柄就可以了。1.2.告知服务管理器服务的状态看了1.1中的例子之后,相信也能知道要如何通知消息管理系统服务自身的启动情况了吧。对,就是这么一句话:SetServiceStatus(hServiceStatusHandle, &ServiceStatus);hServiceStatusHandle是我们注册了管理函数后获得到的一个句柄,ServiceStatus是一个“全局”结构体,表示了服务当前的状态。但是ServiceStatus里面都会存什么东西呢?请看以下的例子:该例子很好理解,就是在服务的main函数中将服务的控制状态进行初始化而已。很明显,我们看到了服务接受的控制指令只有两个,停止与关闭。这就是为什么注册服务管理函数里面我们的case只有两个值得原因,因为我们可以告诉管理器,我们只接受这两个命令。1.3.完整的服务主函数的例子以上就是一个完整的服务主函数的例子。可以看到,我们的服务新建了一个QCoreApplication的实例,然后又实例化了一个叫做Algalon:Observer的类,而这个类正是一个Qt类。对,这就是在服务中使用Qt的方法。但是,因为是服务,想要显示个对话框什么的就算了,这是不现实的虽然经过各种麻烦的工序后也是可以显示对话框就是了2.main函数怎么写说过了以上这么多事情,那么接下来就是重点了:如何真正的写出一个服务。我们已经有了服务的main函数以及服务的控制函数,那么要怎么才能让系统知道这个“服务main函数”,使得程序成为一个真正的服务呢?就是接下来的这么几句话:SERVICE_TABLE_ENTRY ServiceTable1;ServiceTable0.lpServiceName = TEXT(SERVICE_NAME);ServiceTable0.lpServiceProc = (LPSERVICE_MAIN_FUNCTION)service_main;StartServiceCtrlDispatcher(ServiceTable);它的基本含义就是:告诉系统我们有一个服务的main函数,然后请求系统启动这个服务的main函数。是的,我们只需要把这几句话写到main函数中就可以了。然后基本上,服务的框架就算是写完了。完整的main函数如下:3.接下来是什么我们有了服务

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论