您的位置:逆风者 VC++ 正文
 添加时间:2007-09-01 原文发表:2007-08-31 人气:322 来源:vckbase.com

本文章共5420字,分4页,当前第1页,快速翻页:
 

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

原文:Yevgeny Menaker
翻译:Northtibet

逆风编程技术
下载源代码
原文出处:Five Steps to Writing Windows Services in C


摘要

  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 <windows.h>

#include <stdio.h>

接着,定义两个常量:

#define SLEEP_TIME 5000

#define LOGFILE "C:\\MyServices\\memstatus.txt"

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

int WriteToLog(char* str)

{

    FILE* log;

    log = fopen(LOGFILE, "a ");

    if (log == NULL)

    return -1;

    fprintf(log, "%s\n", str);

    fclose(log);

    return 0;

}

声明几个全局变量,以便在程序的多个函数之间共享它们值。此外,做一个函数的前向定义:

SERVICE_STATUS ServiceStatus; 

SERVICE_STATUS_HANDLE hStatus; 



void ServiceMain(int argc, char** argv); 

void ControlHandler(DWORD request); 

int InitService();

  现在,准备工作已经就绪,你可以开始编码了。服务程序控制台程序的一个子集。因此,开始你可以定义一个 main 函数,它是程序的入口点。对于服务程序来说,main 的代码令人惊讶地简短,因为它只创建分派表并启动控制分派机。

void main() 

{ 

    SERVICE_TABLE_ENTRY ServiceTable[2];

    ServiceTable[0].lpServiceName = "MemoryStatus";

    ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;

    

    ServiceTable[1].lpServiceName = NULL;

    ServiceTable[1].lpServiceProc = NULL;



    // 启动服务的控制分派机线程

    StartServiceCtrlDispatcher(ServiceTable); 

} 
 
本文章更多内容1 - 2 - 3 - 4 - 下一页>>
相关文章

在VC项目中使用自定义资源
使用 CInternetSession 封装多线程 http 文
MFC程序员的WTL指南: Part V - 高级对话框用
SQL Server 索引结构及其使用(一)
一个简单的系列号(SN)填写器
安装钩子,托管C 中的字符串以其它
.NET 常见问答:完成器(Finalizer)、程序
用C#开发第一个WINDOWS应用程序(第一部分)
介绍两个 XML 文件操作类
浏览器的定制与扩展
UTF-7 邮件安全的 Unicode 转换编码
ADO智能开发包
解说Win32的窗口子类化
为你的MFC程序添加宏脚本语言
Island Hopper News 范例及其它
如何获取某个动态链接库的版本信息
多层图像合成修正版
在你的MFC应用程序中显示一个JPG文件
FMail文件信使 V2.0
WinSock学习笔记(二)

相关评论


本文章所属分类:首页 VC++

  热门关键字: