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

合集下载

C#编写的windows服务用命令行安装的详细步骤

C#编写的windows服务用命令行安装的详细步骤

第一步:建立好服务,写好代码

第二步:安装

步骤:win+R -----→CMD -------输入microsoft的framework的相应版本的执行程序位置(如:C:\Windows\\Framework\v4.0.30319\InstallUtil.exe -----图一所示文件)-→空一格再输入你的服务的执行文件的路径(如:D:\zt_documents\服务\SSY.DealerLoginStateService.root\SSY.DealerLoginStateService\SSY.LoginStateService\SSY.LoginSt ateService\bin\Debug\XX.exe(这里的.exe写自己的项目的名称) 图三所示文件)--→回车(如果安装成功可以都到如图2所示的提示)

图一

图二

图三

第三步:启动服务

打开服务管理,找到你自己的服务启动

第四步:卸载

步骤:win+R -----→CMD -------输入microsoft的framework的相应版本的执行程序位置(如:C:\Windows\\Framework\v4.0.30319\InstallUtil.exe -u -----图一所示文件)-→空一格再输入-u -→空一格再输入你的服务的执行文件的路径(如:D:\zt_documents\服务\SSY.DealerLoginStateService.root\SSY.DealerLoginStateService\SSY.LoginStateService\SSY.LoginSt

用c#创建windows服务

用c#创建windows服务
03
服务启动和停止事件处理
}
protected override void OnStart(string[] args)
服务启动和停止事件处理
01 02 03
{ // 服务启动时执行的代码 serviceController.Start();
服务启动和停止事件处理
}
protected override void OnStop()
07
常见问题与解决方案
服务无法启动的常见原因
服务依赖项未启动
检查服务所依赖的其他服务是否已启动,并确保 它们的启动类型正确。
配置文件错误
检查服务的配置文件(如app.config或 web.config)是否有语法错误或配置项错误。
ABCD
日志文件缺失或错误
检查服务的日志文件,查看是否有错误或异常信 息,以便定位问题。
实现
在C#中,使用`ServiceController`类来控制 服务的启动和停止,并使用`OnStart`和 `OnStop`方法分别处理服务的启动和停止 事件。
服务启动和停止事件处理
01
示例代码
02
```csharp
03
public partial class MyService : ServiceBase
服务的自动启动设置
设置服务自动启动
在服务的属性中,可以设置服务在 Windows系统启动时自动启动。

C#编写windows服务程序步骤(精)

C#编写windows服务程序步骤(精)

C#编写windows服务程序步骤 1. 新建一个项目,或者从选择当前解决方案--右键-添加--新建项目 2. 选择(项目类型Visual C#项目,(模板Windows 服务,填写要创

建的服务名称(修改默认的WindowService1成为你自己的服务名称,然后按确定按钮.

3. 资源管理器中默认创建一个WindowsService1的项目,项目下包括一个Service1.cs 文件

4. 左侧选择"工具箱"--"组件",拖动一个Timer对象到Service1.cs [设计]这个页面窗体上.点击窗体上的Timers1足见,设置其属性:Interval属性数字N(例如200毫

秒==1秒进行5次操作) 5.双击这个Timer1组件填加自己所需要的功能函数private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e { //本机电脑硬件配置文件 string strFileName=@"c:\ComputerInfo.txt"; string strTest="硬盘信息+显卡信息+主板信息+声卡信息+网卡信息+打印机信息"; //判断传送文件是否存在.如果不存在则写入一行测试信息 if (!File.Exists(strFileName

{ File.CreateText(strFileName; } byte[] content=Encoding.UTF8.GetBytes(strTest; //创

服务进程

服务进程

用C语言编写Windows服务程序的五个步骤(附源代码)

Windows服务被设计用于需要在后台运行的应用程序以及实现没有用户交互的任务。为了学习这种控制台应用程序的基础知识,C(不是C++)是最佳选择。本文将建立并实现一个简单的服务程序,其功能是查询系统中可用物理内存数量,然后将结果写入一个文本文件。最后,你可以用所学知识编写自己的Windows服务。

当初我写第一个NT服务时,我到MSDN上找例子。在那里我找到了一篇Nigel Thompson写的文章:“Creating a Simple Win32Service in C++”,这篇文章附带一个C++例子。虽然这篇文章很好地解释了服务的开发过程,但是,我仍然感觉缺少我需要的重要信息。我想理解通过什么框架,调用什么函数,以及何时调用,但C++在这方面没有让我轻松多少。面向对象的方法固然方便,但由于用类对底层Win32函数调用进行了封装,它不利于学习服务程序的基本知识。这就是为什么我觉得C更加适合于编写初级服务程序或者实现简单后台任务的服务。在你对服务程序有了充分透彻的理解之后,用C++编写才能游刃有余。当我离开原来的工作岗位,不得不向另一个人转移我的知识的时候,利用我用C所写的例子就非常容易解释NT服务之所以然。

服务是一个运行在后台并实现勿需用户交互的任务的控制台程序。Windows NT/2000/XP操作系统提供为服务程序提供专门的支持。人们可以用服务控制面板来配置安装好的服务程序,也就是Windows 2000/XP控制面板|管理工具中的“服务”(或在“开始”|“运行”对话框中输入services.msc/s——译者注)。可以将服务配置成操作系统启动时自动启动,这样你就不必每次再重启系统后还要手动启动服务。

C语言项目windows编程

C语言项目windows编程

C语言项目(windows编程)

————————————————————————————————作者:————————————————————————————————日期:

第一课、

1.新建工程---->创建Windows 窗口应用程序-->一个简单的窗口程序

MessageBox(NULL,TEXT(“正文”), TEXT(“标题”), 显示板按钮); 在开发windows 程序中,几乎所有的字符串都要用TEXT (“”)函数包起来

2.将MB_OK 换成MB_YESNO ,就可以显示两个按钮。MB_YESNOCANCEL 则显示三个按钮

这里的MB_其实是Windows 已经宏定义的常量,MB 表示MessageBox 。 有如下的值:

一、可以设置在对话框中显示的按钮 MB_OK

MB_OKCANCEL MB_YESNO

MB_YESNOCANCEL

MB_ABORTRETRYIGNORE (abort 、retry 、ignore ) MB_RETRYCANCEL

二、可以设置在对话框中显示的

图标 MB_ICONHAND 出现一个叉 MB_ICONQUESTION 变成下图

真正我自

表示显示

MB_ICONEXCLAMATION 出现感叹号表示警告

MB_ICONASTERISK 出现信息提示的感叹号

重要:将函数代码换成(加一条竖线)

MessageBox(NULL,TEXT(“正文”),TEXT(“标题”),MB_YESNO|MB_ICONQUESTION)

就可以既显示图标,有显示yes/no,其他效果类同。效果如下:

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

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

个人收集整理-ZQ被设计用于需要在后台运行地程序以及实现没有用户交互地任务.为了学习这种控制台 应用程序地基础知识,(不是)是最佳 选择.本文将建立并实现一个简单地 服务程序,其功能是查询系统中可当初我写第一个服务时,我到用物理数量,然后将结果写入一个文本文件.最后,你可以用所学知识编写自己地 服务.上找例子.在那里我找到了一篇 写地文章:“”,这篇文章附带一个 例子.虽然这篇文章很好地解释了服务地开发过程,但是,我仍然感觉缺少我需要地重要信息.我想理解通过什 么框架,调用什么函数,以及何时调用,但 在这方面没有让我轻松 多少.面向对象地方法固然方便,但 由于用类对底层 函数调用进行了 封装,它不利于学习服务程序地基本知识.这就是为什么我觉得 更加 适合于编写初级服务程序或者实现 简单后台任务地服务.在你对服务程 序有了充分透彻地理解之后,用 编写才能游刃有余.当我离开原来地 工作岗位,不得不向另一个人转移 我地知识地时候,利用我用 所写地例子就非常容易解释 服务之所 以然.文档来自于网络搜索 服务是一个运行在后台并实现勿需用户交互地任务地控制台程序. 提供为服务程序提 供专门地支持.人们可以用服务控制 面板来配置安装好地服务程序,也 就是 控制面板管理工具中地“服 务”(或在“开始”“运行”对话框中输 入 ——译者注).可以将服务配置 成操作系统启动时自动启动,这样你就不必每次再重启系统后还要手 动启动服务.文档来自于网络搜索本文将首先解释如何创建一个定期查询可用物理内存并将结果写入某个文本文件地服 务.然后指导你完成生成,安装和实 现服务地整个过程.文档来自于网络 搜索第一步:主函数和全局定义首先,包含所需地头文件.例子要调用 函数(. )和磁盘文件写入(. ):文档来自于网络搜 索以下是引用片段:1/6

制作Windows服务和安装程序(C#版)

制作Windows服务和安装程序(C#版)

制作Windows服务和安装程序(C#版)

1、创建服务项目:

打开VS 2005编程环境,在C#中新建Windows服务程序

2、将安装程序添加到服务程序:

在服务项目中双击新建的服务类,默认情况下是Service1.cs,出现Service1.cs设计界面,鼠标右键选择“添加安装程序”,系统自动生成项目安装类ProjectInstaller.cs,安装类中添加了两个安装组件:ServiceProcessInstall和ServiceInstall,并且服务的属性被复制到组件中。

3、设置服务属性:

①设置登录用户:将ServiceProcessInstaller类的Account属性改为LocalSystem,这样服务可以在任意用户登录系统系统时,自启动服务。

②设置服务启动方式:单击ServiceInstaller组件将StartType属性设置为Automatic(随系统启动)

③设置Windows服务名:设置ServiceInstaller组件中的ServiceName的属性为服务的名称,如上图所示的“Service1”

④设置服务描述、服务名称:在ServiceInstaller组件中设置Description和DisPlayName的值分别显示服务的描述和服务名称。

4、编程实现服务程序功能的启动、停止:打开Service1.cs类的代码,在服务启动、停止方法中分别添加服务程序的启动、停止需对应的功能代码。

protected override void OnStart(string[] args)

c windows程序设计教程

c windows程序设计教程

c windows程序设计教程

C语言是一种通用的编程语言,广泛应用于Windows操作系

统的程序开发。在C语言中,可以通过Windows API来使用Windows操作系统提供的功能和服务。本文将介绍C语言在Windows程序设计中的基本知识和常用技巧。

首先,我们需要了解Windows API的使用方法。Windows API

是一组函数和数据结构的集合,可以通过函数调用的方式来调用Windows操作系统提供的功能。在C语言中,可以通过在

代码中包含Windows头文件(例如windows.h)来使用Windows API。通过调用不同的API函数,我们可以实现窗口

创建、消息处理、用户界面设计等功能。

接下来,让我们来了解Windows窗口的创建和消息处理。在Windows程序中,窗口是用户界面的基本元素。我们可以使

用CreateWindow函数来创建窗口,并指定窗口的属性,例如

窗口类名、窗口标题、窗口大小等。创建窗口后,我们需要使用消息循环来处理窗口的消息。消息循环是一个无限循环,用于接收和处理窗口的各种消息,例如鼠标点击、键盘输入等。在消息处理过程中,我们可以根据接收到的消息类型执行相应的操作,例如更新窗口内容、响应用户的操作等。

此外,Windows程序中常常需要使用各种控件来实现用户界面。Windows API提供了一些常用的控件,例如按钮、文本框、列表框等。我们可以使用CreateWindowEx函数来创建这些控件,并设置其属性,例如位置、大小、样式等。创建完控件后,我们可以使用消息处理函数中的相应处理方式来处理控件的消

如何编写C# Windows服务

如何编写C# Windows服务

如何编写C# Windows服务

1、新建C# Windows服务:windows service工程

2、新建windows service工程后,系统自动生成一个Service1.cs文件,默认是其设计视图。选择查看其代码,默认有构造函数、OnStart、OnStop三个函数,如下图所示:

3、新建了C# Windows服务之后,还要设置该服务运行的周期,左侧的ToolBox中有两个timmer,一个在组件下,一个在windows form下,可惜这两个都不能用,我们要手工新建一个timmer,并设置其属性和事件。

1.public WindowsServiceDemo()

2.{

3.InitializeComponent();

4.System.Timers.Timer t = new System.Timers.Ti

mer(1000);//实例化Timer类,设置间隔时间为10000毫秒;

5.t.Elapsed += new System.Timers.ElapsedEventHa

ndler(TimeElapse);//到达时间的时候执行事件;

6.t.AutoReset = true;//设置是执行一次(false)还

是一直执行(true);

7.t.Enabled = true;//是否执行

System.Timers.Timer.Elapsed事件;

8.}

9.

10.

11.public void TimeElapse(object source, System.Timers.ElapsedEventArgs

c语言windows编译过程

c语言windows编译过程

c语言windows编译过程

在Windows操作系统上,使用C语言进行编译的过程主要包括以下几个步骤:

1. 编写源代码:使用文本编辑器编写C语言源代码文件,扩展名为.c。

2. 预处理:使用预处理器对源代码进行处理,包括宏展开、头文件包含、条件编译等。预处理器生成的文件通常具有扩展名为.i。

3. 编译:使用编译器将预处理后的源代码翻译成汇编代码。编译器生成的文件通常具有扩展名为.asm。

4. 汇编:使用汇编器将汇编代码翻译成机器码。汇编器生成的文件通常具有扩展名为.obj。

5. 链接:使用链接器将多个目标文件(.obj)以及所需的库文件进行链接,生成可执行文件。链接器生成的文件通常具有扩展名为.exe。

在Windows上,可以使用多种工具进行C语言的编译,最常用的是Microsoft Visual Studio(包含了Visual C++编译器)和MinGW (包含了GCC编译器)。

在使用Visual Studio进行编译时,可以通过IDE界面进行操作,也可以使用命令行工具(如cl.exe)执行编译命令。

在使用MinGW进行编译时,一般使用命令行工具(如gcc.exe)执行编译命令。编译命令的具体参数可以根据需要进行设置,如指定源代码文件、输出文件名、链接的库文件等。

需要注意的是,编译过程中可能会出现一些错误或警告信息,需要根据编译器的提示进行修改和调试。

使用C进行Windows桌面应用程序开发

使用C进行Windows桌面应用程序开发

使用C进行Windows桌面应用程序开发

Windows桌面应用程序是指能够在Windows操作系统上运行的软件应用程序,通常具有图形用户界面(GUI)且能够提供丰富的功能和交互性。开发Windows桌面应用程序可以使用多种编程语言,其中C语

言是一种常用且强大的选择。本文将介绍使用C语言进行Windows桌

面应用程序开发的基本步骤和相关注意事项。

一、Windows桌面应用程序开发环境的准备

在进行Windows桌面应用程序开发之前,首先需要搭建相应的开发环境。以下是搭建C语言开发环境的基本步骤:

1. 安装C编译器:C语言是一种编译型语言,因此需要安装相应的

C编译器。常用的C编译器有GCC和Visual Studio等。GCC是一款开

源的免费编译器,而Visual Studio是微软官方提供的一套集成开发环

境(IDE),其中包含了C编译器。

2. 配置开发环境:根据选择的C编译器进行相应的环境配置。对于GCC,可以通过在命令行中输入gcc命令来进行编译和链接操作。对

于Visual Studio,可以在IDE中创建一个新的C项目,并在项目设置

中进行相关配置。

二、Windows桌面应用程序的开发流程

在搭建好开发环境后,可以开始进行Windows桌面应用程序的开发。下面是一个基本的开发流程:

1. 确定应用程序需求:在开始开发之前,首先需要明确应用程序的

需求和功能。考虑应用程序的用途、目标用户以及所需的功能和界面

设计,有助于后续的开发工作。

2. 编写代码:使用C语言编写应用程序的功能代码。在编写代码时,可以利用C语言的丰富库函数来实现各种功能,比如文件操作、网络

c#编写windows服务,并制作安装包

c#编写windows服务,并制作安装包

c#编写windows服务,并制作安装包

对服务的认识有很多个阶段。

第⼀阶段:当时还在⽤c++,知道在⼀个进程⾥while(True){},然后⾥⾯做很多很多事情,这就叫做服务了,界⾯可能当时还⽤Console 控制台程序。

第⼆阶段:知道了服务要在后台执⾏,⼀般不会有界⾯显⽰,并且开机⾃启动,于是隐藏Console控制台界⾯,并且通过使⽤SC CREATE 将exe变为服务,并且达到开机⾃启动的⽬的。这时候还是c++ 阶段。

第三阶段:因项⽬需求接触c#,发现有个叫项⽬模板专门制作windows 服务,尝试了下,感觉还不错,省事了许多。通过命令⾏安装服务。

第四阶段:发现了⼀个好东西可以制作安装包,省去了敲命令⾏的痛苦,对实施⼈员来说肯定是个福⾳

⼀,编写windwos 服务

c# 编写windows 服务还算是相当简单的,⾄少⽐c++ 要简单。

1,新建项⽬windows 服务。填写服务名称TestService

创建成功,项⽬界⾯是这样的

2,编写服务代码,右键TestService,查看代码 OnStart,编写启动代码。OnStop编写停⽌代码

namespace TestService

{

public partial class TestService : ServiceBase

{

FileStream fs = null;

StreamWriter sw = null;

Thread td = null;

public TestService()

{

InitializeComponent();

C#创建windows服务

C#创建windows服务

C#创建Windows服务

一、创建Windows Service

1)创建windows服务项目

图1-1

2)对Service1重命名(你所想要的windows服务名称),效果如下图所示

图1-2

二、创建windows服务

在左侧面板上鼠标右键,然后添加安装程序,效果如下图所示

图1-3

添加完成后我们可以看见,系统自动创建了ProjectInstaller安装组件,效果图如下(图1-4)

修改安装服务名(我不做修改,有修改需求的朋友根据自己的需求修改服务名,描述等属性)

图1-5

修改安装权限

写入windows服务代码:

进入MywindowsService服务后台代码(右键查看代码),后台代码里服务启动和服务停止时记录当前时间来测试是否启动或停止。服务代码如下:

namespace MyWindowsService

{

partial class MyWindowsService : ServiceBase

{

public MyWindowsService()

{

InitializeComponent();

}

protected override void OnStart(string[] args)

{

using (System.IO.StreamWriter sw=new System.IO.StreamWriter("C:\\test.txt"))

{

sw.WriteLine("服务开始于:"+System.DateTime.Now.ToString());

}

// TODO: 在此处添加代码以启动服务。

}

protected override void OnStop()

c语言编译过程5步骤

c语言编译过程5步骤

c语言编译过程5步骤

C语言编译过程5步骤

C语言是一种广泛应用于系统软件、嵌入式系统和游戏开发等领域的计算机编程语言。在使用C语言进行编程时,需要经历一系列的编译过程,将源代码转化为可执行的机器代码。本文将介绍C语言编译过程的5个步骤,以帮助读者更好地理解和掌握C语言的编译原理。

第一步:预处理(Preprocessing)

预处理是编译过程的第一步,它主要是对源代码进行一些文本替换和宏展开等操作。在C语言中,预处理指令以“#”开头,例如#include和#define等。预处理器会根据这些指令对源代码进行处理,生成一份经过宏展开和替换的代码文件。预处理的结果是一个纯文本的文件,其中不包含任何C语言的语法结构。

第二步:编译(Compiling)

编译是将预处理后的代码文件转换为汇编代码的过程。在这个阶段,编译器将对源代码进行词法分析、语法分析和语义分析,生成相应的中间表示形式,如抽象语法树(Abstract Syntax Tree,AST)。编译器还会对代码进行优化,以提高程序的性能和效率。最终,编译器将AST转换为汇编代码,其中包含了与机器指令相对应的汇编语句。

第三步:汇编(Assembling)

汇编是将汇编代码转换为可重定位目标文件的过程。在这个阶段,汇编器将汇编代码转换为机器指令的二进制表示形式,并生成与硬件平台相兼容的目标文件。目标文件包含了机器指令、符号表和重定位信息等内容,但还没有进行最终的地址分配。

第四步:链接(Linking)

链接是将多个目标文件和库文件合并为一个可执行文件的过程。在这个阶段,链接器将解析目标文件中的符号引用,并将其与符号定义进行匹配。如果找不到符号的定义,链接器会报错。链接器还会将代码中使用的库函数进行链接,以便在程序执行时能够正确调用这些函数。最终,链接器将生成一个完整的可执行文件,其中包含了所有的机器指令和数据。

windows程序编译流程

windows程序编译流程

windows程序编译流程

Windows程序编译流程

Windows程序编译是将源代码转换为可执行文件的过程。在Windows操作系统中,常用的编译工具是Microsoft Visual Studio。下面将详细介绍Windows程序的编译流程。

一、源代码

编译的第一步是准备源代码。源代码是程序员用编程语言(如C++、C#等)编写的文本文件,它包含了程序的逻辑和功能实现。

二、预处理

在进行实际编译之前,需要进行预处理。预处理器会对源代码进行处理,包括去除注释、展开宏定义、处理条件编译等操作。预处理可以减少编译错误和提高编译效率。

三、编译

编译是将预处理后的源代码转换为汇编语言的过程。编译器会将源代码翻译成汇编指令,生成汇编语言代码文件。汇编语言是一种低级语言,与机器指令相对应。

四、汇编

汇编是将汇编语言代码转换为机器指令的过程。汇编器会将汇编语言代码翻译成机器指令,生成目标文件。目标文件包含了二进制代

码和相关的符号表信息。

五、链接

链接是将多个目标文件和库文件合并为一个可执行文件的过程。链接器会解析目标文件中的符号引用,并将其与定义进行匹配。链接器还会处理库文件的引用,将其与目标文件进行合并。最终生成可执行文件。

在链接的过程中,还会进行地址重定位和符号解析。地址重定位是将目标文件中的相对地址转换为绝对地址的过程。符号解析是根据符号表将符号引用与符号定义进行匹配的过程。

六、生成可执行文件

链接完成后,就会生成可执行文件。可执行文件是可以直接在Windows操作系统上运行的文件。它包含了程序的二进制代码、数据和相关的元数据信息。

C#实现操作windows系统服务(service)的方法

C#实现操作windows系统服务(service)的方法

C#实现操作windows系统服务(service)的⽅法本⽂实例讲述了C#实现操作windows系统服务(service)的⽅法。分享给⼤家供⼤家参考。具体如下:

这段C#代码可以控制启动和停⽌系统服务

/// <summary>

/// 停⽌服务

/// </summary>

private bool StopService(string StopServiceName)

{

ServiceController service = new ServiceController(StopServiceName);

try

{

service.Stop();

service.WaitForStatus(ServiceControllerStatus.Stopped);

}

catch(Exception)

{

return false;

}

return true;

}

/// <summary>

/// 开启服务

/// </summary>

private bool StartService(string StartServiceName)

{

ServiceController service = new ServiceController(StartServiceName);

try

{

service.Start();

service.WaitForStatus(ServiceControllerStatus.Running);

}

catch (Exception)

{

return false;

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

/Article/kfyy/cyy/jszl/200603/3842.html

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):

接着,定义两个常量:

SLEEP_TIME 指定两次连续查询可用内存之间的毫秒间隔。在第二步中编写服务工作循环的时候要使用该常量。

LOGFILE 定义日志文件的路径,你将会用 WriteToLog 函数将内存查询的结果输出到该文件,WriteToLog 函数定义如下:

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

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

一个程序可能包含若干个服务。每一个服务都必须列于专门的分派表中(为此该程序定义了一个 ServiceTable 结构数组)。这个表中的每一项都要在SERVICE_TABLE_ENTRY 结构之中。它有两个域:

lpServiceName: 指向表示服务名称字符串的指针;当定义了多个服务时,那么这个域必须指定;

lpServiceProc: 指向服务主函数的指针(服务入口点);

分派表的最后一项必须是服务名和服务主函数域的 NULL 指针,文本例子程序中只宿主一个服务,所以服务名的定义是可选的。

服务控制管理器(SCM:Services Control Manager)是一个管理系统所有服务的进程。当 SCM 启动某个服务时,它等待某个进程的主线程来调用StartServiceCtrlDispatcher 函数。将分派表传递给StartServiceCtrlDispatcher。这将把调用进程的主线程转换为控制分派器。该分派器启动一个新线程,该线程运行分派表中每个服务的 ServiceMain 函数(本文例子中只有一个服务)分派器还监视程序中所有服务的执行情况。然后分派器将控制请求从 SCM 传给服务。

注意:如果 StartServiceCtrlDispatcher 函数30秒没有被调用,便会报错,为了避免这种情况,我们必须在 ServiceMain 函数中(参见本文例子)或在非主函数的单独线程中初始化服务分派表。本文所描述的服务不需要防范这样的情况。

分派表中所有的服务执行完之后(例如,用户通过“服务”控制面板程序停止它们),或者发生错误时。StartServiceCtrlDispatcher 调用返回。然后主进程终止。

第二步:ServiceMain 函数

Listing 1 展示了 ServiceMain 的代码。该函数是服务的入口点。它运行在一个单独的线程当中,这个线程是由控制分派器创建的。ServiceMain 应该尽可能早早为服务注册控制处理器。这要通过调用 RegisterServiceCtrlHadler 函数来实现。你要将两个参数传递给此函数:服务名和指向ControlHandlerfunction 的指针。

它指示控制分派器调用 ControlHandler 函数处理 SCM 控制请求。注册完

控制处理器之后,获得状态句柄(hStatus)。通过调用 SetServiceStatus 函数,用 hStatus 向 SCM 报告服务的状态。

Listing 1 展示了如何指定服务特征和其当前状态来初始化

ServiceStatus 结构,ServiceStatus 结构的每个域都有其用途:

dwServiceType:指示服务类型,创建 Win32 服务。赋值 SERVICE_WIN32;

dwCurrentState:指定服务的当前状态。因为服务的初始化在这里没有完成,所以这里的状态为 SERVICE_START_PENDING;

dwControlsAccepted:这个域通知 SCM 服务接受哪个域。本文例子是允许STOP 和 SHUTDOWN 请求。处理控制请求将在第三步讨论;

dwWin32ExitCode 和 dwServiceSpecificExitCode:这两个域在你终止服务并报告退出细节时很有用。初始化服务时并不退出,因此,它们的值为 0;

dwCheckPoint 和 dwWaitHint:这两个域表示初始化某个服务进程时要30秒以上。本文例子服务的初始化过程很短,所以这两个域的值都为 0。

调用 SetServiceStatus 函数向 SCM 报告服务的状态时。要提供 hStatus 句柄和 ServiceStatus 结构。注意 ServiceStatus 一个全局变量,所以你可以跨多个函数使用它。ServiceMain 函数中,你给结构的几个域赋值,它们在服务运行的整个过程中都保持不变,比如:dwServiceType。

在报告了服务状态之后,你可以调用 InitService 函数来完成初始化。这个函数只是添加一个说明性字符串到日志文件。如下面代码所示:

在 ServiceMain 中,检查 InitService 函数的返回值。如果初始化有错(因为有可能写日志文件失败),则将服务状态置为终止并退出 ServiceMain:

相关文档
最新文档