预览加载中,请您耐心等待几秒...
1/7
2/7
3/7
4/7
5/7
6/7
7/7

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

Windows服务被设计用于需要在后台运行的HYPERLINK"http://search.yesky.com/search.do?wd=%D3%A6%D3%C3"\t"_blank"应用程序以及实现没有用户交互的任务。为了学习这种控制台应用程序的基础知识,HYPERLINK"http://product.yesky.com/product/225/225032/"\t"_blank"C(不是C++)是最佳选择。本文将建立并实现一个简单的服务程序,其功能是查询系统中可用物理HYPERLINK"http://product.yesky.com/memory/"\t"_blank"内存数量,然后将结果写入一个文本文件。最后,你可以用所学知识编写自己的Windows服务。当初我写第一个NT服务时,我到MSDN上找例子。在那里我找到了一篇NigelThompson写的文章:“CreatingaSimpleWin32ServiceinC++”,这篇文章附带一个C++例子。虽然这篇文章很好地解释了服务的开发过程,但是,我仍然感觉缺少我需要的重要信息。我想理解通过什么框架,调用什么函数,以及何时调用,但C++在这方面没有让我轻松多少。面向对象的方法固然方便,但由于用类对底层Win32函数调用进行了封装,它不利于学习服务程序的基本知识。这就是为什么我觉得C更加适合于编写初级服务程序或者实现简单后台任务的服务。在你对服务程序有了充分透彻的理解之后,用C++编写才能游刃有余。当我离开原来的工作岗位,不得不向另一个人转移我的知识的时候,利用我用C所写的例子就非常容易解释NT服务之所以然。服务是一个运行在后台并实现勿需用户交互的任务的控制台程序。WindowsNT/2000/XPHYPERLINK"http://product.yesky.com/os/"\t"_blank"操作系统提供为服务程序提供专门的支持。人们可以用服务控制面板来配置安装好的服务程序,也就是Windows2000/XP控制面板|管理工具中的“服务”(或在“开始”|“运行”对话框中输入services.msc/s——译者注)。可以将服务配置成操作系统启动时自动启动,这样你就不必每次再重启系统后还要手动启动服务。本文将首先解释如何创建一个定期查询可用物理内存并将结果写入某个文本文件的服务。然后指导你完成生成,安装和实现服务的整个过程。第一步:主函数和全局定义首先,包含所需的头文件。例子要调用Win32函数(windows.h)和磁盘文件写入(stdio.h): #include<windows.h>#include<stdio.h>接着,定义两个常量: #defineSLEEP_TIME5000#defineLOGFILE"C:\\MyServices\\memstatus.txt"SLEEP_TIME指定两次连续查询可用内存之间的毫秒间隔。在第二步中编写服务工作循环的时候要使用该常量。LOGFILE定义日志文件的路径,你将会用WriteToLog函数将内存查询的结果输出到该文件,WriteToLog函数定义如下: intWriteToLog(char*str){FILE*log;log=fopen(LOGFILE,"a+");if(log==NULL)return-1;fprintf(log,"%s\n",str);fclose(log);return0;}声明几个全局变量,以便在程序的多个函数之间共享它们值。此外,做一个函数的前向定义: SERVICE_STATUSServiceStatus;SERVICE_STATUS_HANDLEhStatus;voidServiceMain(intargc,char**argv);voidControlHandler(DWORDrequest);intInitService();现在,准备工作已经就绪,你可以开始编码了。服务程序控制台程序的一个子集。因此,开始你可以定义一个main函数,它是程序的入口点。对于服务程序来说,main的代码令人惊讶地简短,因为它只创建分派表并启动控制分派机。 voidmain(){SERVICE_TABLE_ENTRYServiceTable[2];ServiceTable[0].lpServiceName="MemoryStatus";ServiceTable[0].lpServiceProc=(LPSERVICE_MAIN_FUNCTION)ServiceMain;ServiceTable[1].lpServiceName=NULL;ServiceTable[1].lpServiceProc=NULL;//启动服务的控制分派机线程StartServiceCtrlDispatcher