background image

C 语言编写 Windows 服务程序的五个步骤

    Windows 服务被设计用于需要在后台运行的应用程序以及实现没有用户交互的任务。为了
学习这种控制台应用程序的基础知识,

C(不是 C++)是最佳选择。本文将建立并实现一个

简单的服务程序,其功能是查询系统中可用物理内存数量,然后将结果写入一个文本文件。
最后,你可以用所学知识编写自己的

 Windows 服务。

  当初我写第一个

 NT  服务时,我到 MSDN  上找例子。在那里我找到了一篇  Nigel 

Thompson 写的文章:“Creating a Simple Win32 Service in C++”,这篇文章附带一个 C++ 例
子。虽然这篇文章很好地解释了服务的开发过程,但是,我仍然感觉缺少我需要的重要信息。
我想理解通过什么框架,调用什么函数,以及何时调用,但

 C++ 在这方面没有让我轻松多

少。面向对象的方法固然方便,但由于用类对底层

 Win32 函数调用进行了封装,它不利于

学习服务程序的基本知识。这就是为什么我觉得

 C 更加适合于编写初级服务程序或者实现

简单后台任务的服务。在你对服务程序有了充分透彻的理解之后,用

 C++ 编写才能游刃有

余。当我离开原来的工作岗位,不得不向另一个人转移我的知识的时候,利用我用

 C 所写

的例子就非常容易解释

 NT 服务之所以然。

    服 务 是 一 个 运 行 在 后 台 并 实 现 勿 需 用 户 交 互 的 任 务 的 控 制 台 程 序 。

Windows 

NT/2000/XP 操作系统提供为服务程序提供专门的支持。人们可以用服务控制面板来配置安
装好的服务程序,也就是

 Windows 2000/XP 控制面板|管理工具中的“服务”(或在“开始”|

“运行”对话框中输入 services.msc /s——译者注)。可以将服务配置成操作系统启动时自动
启动,这样你就不必每次再重启系统后还要手动启动服务。
  本文将首先解释如何创建一个定期查询可用物理内存并将结果写入某个文本文件的服
务。然后指导你完成生成,安装和实现服务的整个过程。

第一步:主函数和全局定义

首 先 , 包 含 所 需 的 头 文 件 。 例 子 要 调 用

  Win32  函 数 ( windows.h ) 和 磁 盘 文 件 写 入

stdio.h):

#include
#include
接着,定义两个常量:

#define SLEEP_TIME 5000
#define LOGFILE "C:\\MyServices\\memstatus.txt"
SLEEP_TIME 指定两次连续查询可用内存之间的毫秒间隔。在第二步中编写服务工作循环
的时候要使用该常量。
LOGFILE 定义日志文件的路径,你将会用 WriteToLog 函数将内存查询的结果输出到该文
件,

WriteToLog 函数定义如下:

int WriteToLog(char* str)
{
    FILE* log;