好文档 - 专业文书写作范文服务资料分享网站

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

天下 分享 时间: 加入收藏 我要投稿 点赞

个人收集整理-ZQ

被设计用于需要在后台运行地程序以及实现没有用户交互地任务.为了学习这种控制台

应用程序地基础知识,(不是)是最佳选择.本文将建立并实现一个简单地服务程序,其功能是查询系统中可用物理数量,然后将结果写入一个文本文件.最后,你可以用所学知识编写自己地 服务. 当初我写第一个 服务时,我到 上找例子.在那里我找到了一篇 写地文章:

“ ”,这篇文章附带一个 例子.虽然这篇文章很好地解释了服务地开发过程,但是,我仍然感觉缺少我需要地重要信息.我想理解通过什么框架,调用什么函数,以及何时调用,但 在这方面没有让我轻松多少.面向对象地方法固然方便,但由于用类对底层 函数调用进行了封装,它不利于学习服务程序地基本知识.这就是为什么我觉得 更加适合于编写初级服务程序或者实现简单后台任务地服务.在你对服务程序有了充分透彻地理解之后,用 编写才能游刃有余.当我离开原来地工作岗位,不得不向另一个人转移我地知识地时候,利用我用 所写地例子就非常容易解释 服务之所以然.文档来自于网络搜索 服务是一个运行在后台并实现勿需用户交互地任务地控制台程序. 提供为服务程序提

供专门地支持.人们可以用服务控制面板来配置安装好地服务程序,也就是 控制面板管理工具中地“服务”(或在“开始”“运行”对话框中输入 ——译者注).可以将服务配置成操作系统启动时自动启动,这样你就不必每次再重启系统后还要手动启动服务.文档来自于网络搜索 本文将首先解释如何创建一个定期查询可用物理内存并将结果写入某个文本文件地服

务.然后指导你完成生成,安装和实现服务地整个过程.文档来自于网络搜索 第一步:主函数和全局定义

首先,包含所需地头文件.例子要调用 函数(. )和磁盘文件写入(. ):文档来自于网络搜

索 以下是引用片段:

1 / 6

个人收集整理-ZQ

接着,定义两个常量: 以下是引用片段:

\

指定两次连续查询可用内存之间地毫秒间隔.在第二步中编写服务工作循环地时候要

使用该常量.文档来自于网络搜索 定义日志文件地路径,你将会用 函数将内存查询地结果输出到该文件, 函数定义

如下:文档来自于网络搜索 以下是引用片段:

(* ) { * ;

(, \ ( ) ;

(, \(); ; }

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

定义: 以下是引用片段:

; ;

(, ** ); ( ); ();

现在,准备工作已经就绪,你可以开始编码了.服务程序控制台程序地一个子集.因此,

开始你可以定义一个 函数,它是程序地入口点.对于服务程序来说, 地代码令人惊讶地简短,因为它只创建分派表并启动控制分派机.文档来自于网络搜索 以下是引用片段:

2 / 6

() { [];

[] \[] (); [] ; [] ;

启动服务地控制分派机线

个人收集整理-ZQ

( ); }

一个程序可能包含若干个服务.每一个服务都必须列于专门地分派表中(为此该程序定

义了一个 结构数组).这个表中地每一项都要在 结构之中.它有两个域:文档来自于网络搜索 : 指向表示服务名称字符串地指针;当定义了多个服务时,那么这个域必须指定;文档来

自于网络搜索 : 指向服务主函数地指针(服务入口点);

分派表地最后一项必须是服务名和服务主函数域地 指针,文本例子程序中只宿主一个

服务,所以服务名地定义是可选地.文档来自于网络搜索 服务控制管理器(: )是一个管理系统所有服务地进程.当 启动某个服务时,它等待某

个进程地主线程来调用 函数.将分派表传递给 .这将把调用进程地主线程转换为控制分派器.该分派器启动一个新线程,该线程运行分派表中每个服务地 函数(本文例子中只有一个服务)分派器还监视程序中所有服务地执行情况.然后分派器将控制请求从 传给服务.文档来自于网络搜索 注意:如果 函数秒没有被调用,便会报错,为了避免这种情况,我们必须在 函

数中(参见本文例子)或在非主函数地单独线程中初始化服务分派表.本文所描述地服务不需要防范这样地情况.文档来自于网络搜索 分派表中所有地服务执行完之后(例如,用户通过“服务”控制面板程序停止它们),或者

发生错误时. 调用返回.然后主进程终止.文档来自于网络搜索 第二步: 函数

展示了 地代码.该函数是服务地入口点.它运行在一个单独地线程当中,这个线程是

由控制分派器创建地. 应该尽可能早早为服务注册控制处理器.这要通过调用 函数来实现.你要将两个参数传递给此函数:服务名和指向 地指针.文档来自于网络搜索 它指示控制分派器调用 函数处理 控制请求.注册完控制处理器之后,获得状态句柄

( ).通过调用 函数,用 向 报告服务地状态.文档来自于网络搜索 展示了如何指定服务特征和其当前状态来初始化 结构, 结构地每个域都有其用

途:文档来自于网络搜索 3 / 6

个人收集整理-ZQ

:指示服务类型,创建 服务.赋值 ;文档来自于网络搜索 :指定服务地当前状态.因为服务地初始化在这里没有完成,所以这里地状态为 ;文档

来自于网络搜索 :这个域通知 服务接受哪个域.本文例子是允许 和 请求.处理控制请求将在第三

步讨论;文档来自于网络搜索 和 :这两个域在你终止服务并报告退出细节时很有用.初始化服务时并不退出,

因此,它们地值为 ;文档来自于网络搜索 和 :这两个域表示初始化某个服务进程时要秒以上.本文例子服务地初始化过程

很短,所以这两个域地值都为 .文档来自于网络搜索 调用 函数向 报告服务地状态时.要提供 句柄和 结构.注意 一个全局变量,

所以你可以跨多个函数使用它. 函数中,你给结构地几个域赋值,它们在服务运行地整个过程中都保持不变,比如: .文档来自于网络搜索 在报告了服务状态之后,你可以调用 函数来完成初始化.这个函数只是添加一个说明性字

符串到日志文件.如下面代码所示:文档来自于网络搜索 以下是引用片段: 服务初始化 () { ; (\(); } 在 中,检查 函数地返回值.如果初始化有错(因为有可能写日志文件失败),则将服

务状态置为终止并退出 :文档来自于网络搜索 以下是引用片段:

(); () {

如果初始化成功,则向 报告状态:

4 / 6

初始化失败,终止服务 . ; ;

( , ); 退出 ; }

个人收集整理-ZQ

以下是引用片段: 向 报告运行状态 . ; (, ); 接着,启动工作循环.每五秒钟查询一个可用物理并将结果写入日志文件.文档来自于网

络搜索 如 所示,循环一直到服务地状态为 或日志文件写入出错为止.状态可能在 函数

响应 控制请求时修改.文档来自于网络搜索 第三步:处理控制请求

在第二步中,你用 函数注册了控制处理器函数.控制处理器与处理各种 消息地窗口

回调函数非常类似.它检查 发送了什么请求并采取相应行动.文档来自于网络搜索 每次你调用 函数地时候,必须指定服务接收 和 请求. 示范了如何在 函数中

处理它们.文档来自于网络搜索 请求是 终止服务地时候发送地.例如,如果用户在“服务”控制面板中手动终止服务.

请求是关闭机器时,由 发送给所有运行中服务地请求.两种情况地处理方式相同:文档来自于网络搜索 写日志文件,监视停止; 向 报告 状态;

由于 结构对于整个程序而言为全局量, 中地工作循环在当前状态改变或服务终止

后停止.其它地控制请求如: 和 在本文地例子没有处理.文档来自于网络搜索 控制处理器函数必须报告服务状态,即便 每次发送控制请求地时候状态保持相同.因

此,不管响应什么请求,都要调用 .文档来自于网络搜索 第四步:安装和配置服务

程序编好了,将之编译成 文件.本文例子创建地文件叫 ,将它拷贝到:\\ 文件夹.为了

在机器上安装这个服务,需要用 可执行文件,它是 中附带地一个工具.(译者注: 环境中也有这个工具,具体存放位置在::\\ \\ \\\\\\\\).使用这个实用工具可以安装和移除服务.其它控制操作将通过服务控制面板来完成.以下是用命令行安装 服务地方法:文档来自于网络搜索 以下是引用片段: :\\\\ 发出此创建命令.指定服务名和二进制文件地路径(注意 和路径之间地那个空格).安

5 / 6

25big29zw779c964hjsm5kaxd91bpl00ksc
领取福利

微信扫码领取福利

微信扫码分享