C语言编写Windows服务程序

C语言编写Windows服务程序
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:file://MyServices//memstatus.txt"

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:

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

// 向SCM 报告运行状态

ServiceStatus.dwCurrentState = SERVICE_RUNNING;

SetServiceStatus (hStatus,&ServiceStatus);

接着,启动工作循环。每五秒钟查询一个可用物理内存并将结果写入日志文件。

如Listing 1 所示,循环一直到服务的状态为SERVICE_RUNNING 或日志文件写入出错为止。状态可能在ControlHandler 函数响应SCM 控制请求时修改。

第三步:处理控制请求

在第二步中,你用ServiceMain 函数注册了控制处理器函数。控制处理器与处理各种Windows 消息的窗口回调函数非常类似。它检查SCM 发送了什么请求并采取相应行动。

每次你调用SetServiceStatus 函数的时候,必须指定服务接收STOP 和SHUTDOWN 请求。Listing 2 示范了如何在ControlHandler 函数中处理它们。

STOP 请求是SCM 终止服务的时候发送的。例如,如果用户在“服务”控制面板中手动终止服务。SHUTDOWN 请求是关闭机器时,由SCM 发送给所有运行中服务的请求。两种情况的处理方式相同:

写日志文件,监视停止;

向SCM 报告SERVICE_STOPPED 状态;

由于ServiceStatus 结构对于整个程序而言为全局量,ServiceStatus 中的工作循环在当前状态改变或服务终止后停止。其它的控制请求如:PAUSE 和CONTINUE 在本文的例子没有处理。

控制处理器函数必须报告服务状态,即便SCM 每次发送控制请求的时候状态保持相同。因此,不管响应什么请求,都要调用SetServiceStatus.

第四步:安装和配置服务

程序编好了,将之编译成exe 文件。本文例子创建的文件叫MemoryStatus.exe,将它拷贝到C:\MyServices 文件夹。为了在机器上安装这个服务,需要用SC.EXE 可执行文件,它是Win32 Platform SDK 中附带的一个工具。(译者注:Visaul Studio .NET 2003 IDE 环境中也有这个工具,具体存放位置在:C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Tools\Bin\winnt)。使用这个实用工具可以安装和移除服务。其它控制操作将通

过服务控制面板来完成。以下是用命令行安装MemoryStatus 服务的方法:sc create MemoryStatus binpath= c:\MyServices\MemoryStatus.exe发出此创建命令。指定服务名和二进制文件的路径(注意binpath= 和路径之间的那个空格)。安装成功后,便可以用服务控制面板来控制这个服务。用控制面板的工具栏启动和终止这个服务。

MemoryStatus 的启动类型是手动,也就是说根据需要来启动这个服务。右键单击该服务,然后选择上下文菜单中的“属性”菜单项,此时显示该服务的属性窗口。在这里可以修改启动类型以及其它设置。你还可以从“常规”标签中启动/停止服务。以下是从系统中移除服务的方法:sc delete MemoryStatus

指定“delete” 选项和服务名。此服务将被标记为删除,下次西通重启后,该服务将被完全移除。

第五步:测试服务

从服务控制面板启动MemoryStatus 服务。如果初始化不出错,表示启动成功。过一会儿将服务停止。检查一下C:\MyServices 文件夹中memstatus.txt 文件的服务输出。在我的机器上输出是这样的:

Monitoring started.

273469440

273379328

273133568

273084416

Monitoring stopped.

为了测试MemoryStatus 服务在出错情况下的行为,可以将memstatus.txt 文件设置成只读。这样一来,服务应该无法启动。

去掉只读属性,启动服务,在将文件设成只读。服务将停止执行,因为此时日志文件写入失败。如果你更新服务控制面板的内容,会发现服务状态是已经停止。

windows服务大全

windows服务大全 一、什么是系统服务 在Windows 2000/XP/2003系统中,服务是指执行指定系统功能的程序、例程或进程,以便支持其他程序,尤其是低层(接近硬件)程序。通过网络提供服务时,服务可以在Active Directory(活动目录)中发布,从而促进了以服务为中心的管理和使用。 服务是一种应用程序类型,它在后台运行。服务应用程序通常可以在本地和通过网络为用户提供一些功能,例如客户端/服务器应用程序、Web服务器、数据库服务器以及其他基于服务器的应用程序。 二、配置和管理系统服务 通过上面的阅读,相信你已对Windows系统服务有所了解,与系统注册表类似,对系统服务的操作,我们可以通过“服务管理控制台”来实现。 以管理员或Administrators组成员身份登录,单击“开始→运行”菜单项,在出现的对话框中键入“Services.msc”并回车,即可打开“服务管理控制台”。你也可以单击“开始→控制面板→性能和维护→管理工具→服务”选项来启动该控制台。 在服务控制台中,双击任意一个服务,就可以打开该服务的属性对话框。在这里,我们可以对服务进行配置、管理操作,通过更改服务的启动类型来设置满足自己需要的启动、关闭或禁用服务。 在“常规”选项卡中,“服务名称”是指服务的“简称”,并且也是在注册表中显示的名称;“显示名称”是指在服务配置界面中每项服务显示的名称;“描述”是为该服务作的简单解释;“可执行文件的路

径”即是该服务对应的可执行文件的具体位置;“启动类型”是整个服务配置的核心,对于任意一个服务,通常都有3种启动类型,即自动、手动和已禁用。只要从下拉菜单中选择就可以更改服务的启动类型。“服务状态”是指服务的现在状态是启动还是停止,通常,我们可以利用下面的“启动”、“停止”、“暂停”、“恢复”按钮来改变服务的状态。 下面让我们来看看3种不同类型的启动状态: 自动:此服务随着系统启动时启动,它将延长启动所需要的时间,有些服务是必须设置为自动的,如Remote Procedure Call(RPC)。由于依存关系或其他影响,其他的一些服务也必须设置为自动,这样的服务最好不要去更改它,否则系统无法正常运行。 手动:如果一个服务被设置为手动,那么可以在需要时再运行它。这样可以节省大量的系统资源,加快系统启动。 已禁用:此类服务不能再运行。这个设置一般在提高系统安全性时使用。如果怀疑一个陌生的服务会给你的系统带来安全上的隐患,可以先尝试停止它,看看系统是否能正常运行,如果一切正常,那么就可以直接禁用它了。如果以后需要这个服务,在启动它之前,必须先将启动类型设置为自动或手动。 单击“依存关系”选项卡,在这里我们可以看到,在顶端列表中指出运行选定服务所需的其他服务,底端列表指出了需要运行选定服务才能正确运行的服务。它说明了一些服务并不能单独运行,必须依靠其他服务。在停止或禁用一个服务之前,一定要看看这个服务的依存关系,

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

用C语言编写Windows服务程序的五个步骤 https://www.360docs.net/doc/a49643813.html,/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): 接着,定义两个常量:

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

第一步:建立好服务,写好代码 第二步:安装 步骤:win+R -----→CMD -------输入microsoft的framework的相应版本的执行程序位置(如:C:\Windows\https://www.360docs.net/doc/a49643813.html,\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\https://www.360docs.net/doc/a49643813.html,\Framework\v4.0.30319\InstallUtil.exe -u -----图一所示文件)-→空一格再输入-u -→空一格再输入你的服务的执行文件的路径(如:D:\zt_documents\服务\SSY.DealerLoginStateService.root\SSY.DealerLoginStateService\SSY.LoginStateService\SSY.LoginSt

Windows服务

Windows 服务应用程序介绍 Microsoft Windows 服务(即,以前的 NT 服务)使您能够创建在它们自己的Windows 会话中可长时间运行的可执行应用程序。这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面。这使服务非常适合在服务器上使用,或任何时候,为了不影响在同一台计算机上工作的其他用户,需要长时间运行功能时使用。还可以在不同于登录用户的特定用户帐户或默认计算机帐户的安全上下文中运行服务。有关服务和 Windows 会话的更多信息,请参见MSDN Online 的 Platform SDK 文档中的“About Services”部分。 注意Windows 服务应用程序项目模板和相关的功能在 Visual Basic 和 Visual C# .NET 的标准版中不可用。有关更多信息,请参见Visual Basic 标准版功能或Visual C# 标准版的功能。 通过创建作为服务安装的应用程序,可以轻松地创建服务。例如,假设要监视性能计数器数据并对阈值做出反应。可以编写一个侦听性能计数器数据的 Windows 服务应用程序、部署该应用程序并开始收集和分析数据。 将服务创建为 Microsoft Visual Studio .NET 项目,并在其中定义特定代码,以控制可以发送到服务的命令和接收到这些命令时采取的操作。可以发送到服务的命令包括开始、暂停、继续和停止该服务,以及执行自定义命令。 创建并生成了应用程序后,可以通过运行命令行实用工具InstallUtil.exe 并将路径传递给服务的可执行文件,或通过使用 Visual Studio 的部署功能来安装该应用程序。然后可以使用服务控制管理器启动、停止、暂停、继续和配置服务。这些任务中有许多也可以在“服务器资源管理器”的“服务”节点中或通过使用ServiceController类来实现。 服务应用程序与其他 Visual Studio .NET 应用程序对比 服务应用程序与其他许多项目类型的功能在几个方面有所不同: ?必须将服务应用程序项目创建的已编译可执行文件安装在服务器上,此项目才能以有意义的方式运行。不能通过按 F5 键或 F11 键来调试或运行服务应 用程序;不能立即运行服务或进入并单步执行其代码。相反,必须安装和启动服务,然后将一个调试器附加到服务的进程中。有关更多信息,请参见调试 Windows 服务应用程序。 ?与一些类型的项目不同,对于服务应用程序,必须为其创建安装组件。安装组件在服务器上安装和注册服务,并用 Windows 服务控制管理器为服务创 建一个项。有关更多信息,请参见将安装程序添加到服务应用程序。

C# Windows服务开发

一、VS2012下开发Windows服务 1、打开VS2012,新建项目,选择Windows服务,此处我以开发一个定时自动发送邮件的服务来做介绍,如下图: 2、创建好后,编译器会自动创建一些文件,其中会有一个Service1类文件,该文件是服务的关键,我们可以将其重命名,这里我将其命名为MainService,如下图: 3、在MainService的后台代码中会自动创建一些方法,包括服务的启动和停止方法等,如下图:

4、将服务启动时要执行的操作放在OnStart方法中,服务停止时要执行的操作放在OnStop方法中 5、在MainService.cs设计器中,单击邮件,选择选择添加安装程序,便会生成一个ProjectInstaller.cs的文件,如图所示: 6、设置ProjectInstaller.cs的属性,切换到属性设置界面 (1)选择serviceInstaller1,并设置相应属性如下图所示:

其中:Description属性用于设置服务安装之后再服务界面上显示的描述信息; DisplayName属性用于设置服务安装之后再服务界面上显示的服务名称; ServiceName属性用于设置服务的名称,此名称必须与ServiceBase类的ServiceName 属性设置的名称一致,该名称用于系统标识此服务,可以理解成DisplayName为ServiceName的别名; StartType属性用于设置服务的启动方式。 (2)选择serviceProcessInster1,设置其属性如下:

此处主要设置Account属性,该属性用来指示运行该服务时的账户类型,一般设置为LocalSystem。 7、到此步一个简单的windows服务就创建好了,编译程序会生成一个EmailService.exe 的可执行文件,接下来便是安装服务了。 Windows服务的安装有多种方式,比如可以再cmd下调用命令来安装,也可以写一个安装程序来安装,此处介绍使用bat批处理来安装。 1、安装Windows服务需要用到InstallUtil.exe程序,该程序位于: C:\Windows\https://www.360docs.net/doc/a49643813.html,\Framework64\v4.0.30319 .NET4.0 C:\Windows\https://www.360docs.net/doc/a49643813.html,\Framework64\v2.0.50727 .NET2.0 2、我们可以再批处理命令中直接调用以上目录中的InstallUtil.exe程序,也可以将该程序拷贝到应用程序的目录下,此处我选择奖该程序拷贝到应用程序的目录下,同时将批处理文件也创建在应用程序的的目录下,如下图所示:

Windows服务开发实例

C#Windows服务程序开发实例介绍 C#Windows服务程序开发实例程序的目的和用途: 很多开机启动程序仅仅加在启动项里面,只有登陆后才真正启动。windows服务在开机未进行用户登录前就启动了。正是利用这一点,解决一些服务器自动重启后特定软件也自动启动的问题。 C#Windows服务程序开发1. 新建一个服务项目 visual C#----windows----windows服务; C#Windows服务程序开发2. 添加一个dataset(.xsd),用于存储启动目标的路径,日志路径等。 在dataset可视化编辑中,添加一个datatable,包含两列 StartAppPath 和LogFilePath。分别用于存储目标的路径、日志路径。 我认为利用dataset.xsd存储配置参数的优势在于可以忽略xml解析的具体过程直接使用xml文件。 在dataset中提供了ReadXml方法用于读取xml文件并将其转换成内存中的一张datatable表,数据很容易取出来!同样,WriteXml方法用于存储为xml格式的文件,也仅仅需要一句话而已。 C#Windows服务程序开发3. program.cs文件作为程序入口,代码如下: https://www.360docs.net/doc/a49643813.html,ing ; https://www.360docs.net/doc/a49643813.html,ing System.ServiceProcess; https://www.360docs.net/doc/a49643813.html,ing System.Text; https://www.360docs.net/doc/a49643813.html,space WindowsServices_AutoStart 5.{ 6.static class Program 7.{ 8./// ﹤summary﹥ 9./// 应用程序的主入口点。 10./// ﹤/summary﹥ 11.static void Main() 12.{ 13.ServiceBase[] ServicesToRun;

Windows服务编写原理及探讨

Windows服务编写原理及探讨 有那么一类应用程序,是能够为各种用户(包括本地用户和远程用户)所用的,拥有用户授权级进行管理的能力,并且不论用户是否物理的与正在运行该应用程序的计算机相连都能正常执行,这就是所谓的服务了。 (一)服务的基础知识 Question 1. 什么是服务?它的特征是什么? 在NT/2000中,服务是一类受到操作系统优待的程序。一个服务首先是一个Win32可执行程序,如果要写一个功能完备且强大的服务,需要熟悉动态连接库(Dlls)、结构异常处理、内存映射文件、虚拟内存、设备I/O、线程及其同步、Unicode以及其他的由WinAPI函数提供的应用接口。当然本文讨论的只是建立 一个可以安装、运行、启动、停止的没有任何其他功能的服务,所以无需上述知识仍可以继续看下去,我会在过程中将理解本文所需要的知识逐一讲解。 第二要知道的是一个服务决不需要用户界面。大多数的服务将运行在那些被锁在某些黑暗的,冬暖夏凉的小屋子里的强大的服务器上面,即使有用户界面一般也没有人可以看到。如果服务提供任何用户界面如消息框,那么用户错过这些消息的可能性就极高了,所以服务程序通常以控制台程序的形式被编写,进 入点函数是main()而不是WinMain()。 也许有人有疑问:没有用户界面的话,要怎样设置、管理一个服务?怎样开始、停止它?服务如何发出警告或错误信息、如何报告关于它的执行情况的统计数据?这些问题的答案就是服务能够被远程管理, Windows NT/2000提供了大量的管理工具,这些工具允许通过网络上的其它计算机对某台机器上面的服务进行管理。比如Windows 2000里面的“控制台”程序(mmc.exe),用它添加“管理单元”就可以管理本机或其他机器上的服务。

VC编写Windows服务程序

#include #include #include TCHAR szServ iceN ame[] = _T("My TestSer v ice"); DWORD dwThreadID; HANDLE hEvent = INVALID_HANDLE_VALUE; SERVICE_STATUS s tatus; SERVICE_STATUS_HANDLE hServ iceStatus; v oi d Init(); BOOL IsSer v iceInstalled(); BOOL InstallSer v ice(); BOOL U ninstallSer v ice(); BOOL Ser v iceCtrlStart(); BOOL Ser v iceCtrlStop(); v oi d WINAPI Ser v iceMai n(); v oi d WINAPI Ser v iceStrl(DWORD dwOpc ode); v oi d LogEv ent(LPCTSTR pszFormat, ...); //Usuage // Ins tall ser v ice: //TestServ ic e.exe /i nstall // Uninstall ser v ice: //TestServ ic e.exe /unins tall // Start ser v ice: //TestServ ic e.exe /s tart // Stop s erv ic e: //TestServ ic e.exe /s top

windows服务程序的编写

摘要:几乎所有的操作系统在启动的时候都会启动一些不需要与用户交互的进程,这些进程在Windows中就被称作服务。它由服务程序、服务控制程序(SCP,service control program)和服务控制管理器(SCM,service control manager)三个组件构成。本文针对服务程序与服务控制程序的编写进行综合讲述。 关键词:Windows,服务,VC++ ?1 服务介绍 几乎所有的操作系统在启动的时候都会启动一些不需要与用户交互的进程,这些进程在Windows中就被称作服务。它通常用于实现客户/服务器模式中的服务器方,如我们常见的Web服务IIS,当操作系统在启动后它就自动被运行,不管是否有人登陆到系统只要系统开启它就能得到运行。 服务程序、服务控制程序(SCP,service control program)和服务控制管理器(SCM,service control manager)组成了Windows服务。我们可以通过服务控制程序操纵服务控制管理器来配置、启动、暂停、停止服务程序。其中服务程序和服务控制程序可以由我们自己来编写扩展,而服务控制管理器(\windows\system32\servics.exe)则是操作系统内置的一个部件。首先我们来了解一下SCM的工作情况,然后我们介绍服务程序的编写和服务控制时所涉及API的使用。 ?2 服务控制管理器 SCM本身也是一个服务程序(\windows\system32\servics.exe),作为windows的后台服务运行的。Winlogon在系统引导的早期会将SCM启动起来。SCM的服务入口函数首先创建一个初始化为无信号的同步事件对象(SvcCtrlEvent_A3752DX);接下来,它开始建立一个内部服务数据库,这个数据库要按事先规定好的一个顺序列出所有服务组,并记录与服务相关的详细信息;当这个数据库建立完成时SCM就开始按顺序启动那些启动方式为自动的服务,如果有服务要动行于指定用户账户中时还要调用LSASS,如果服务启动失败则会被放入一个名为ScFailedDrivers的列表中。当这些工作都完成后,SCM将同步事件对象SvcCtrlEvent_A3752DX置为有信号状态;并做好系统停机的准备。 当系统要关机时会向Windows子系统进程Csrss发送一个消息,以便调用Csrss的停机例程。Csrss会对所有活动的进程循环通知系统正在停机。对于除SCM以外的每一个系统进程如果

c开发windowsservice程序

C#开发Windows Service程序 Windows Service概念介绍 Windows Service,也称Windows服务,是32位Windows 操作系统中一种长期运行的后台程序。它们长期后台运行,没有用户界面,默默无闻,但它们却是支持Windows正常 运行的幕后英雄,却永无出头之日。 Windows服务程序为其他系统模块提供了非常重要的服务,而且各个Windows服务分工明确,比如IISAdmin服务提供WEB内容的发布功能,若IISAdmin服务不启动,则静态HTML页面、ASP、https://www.360docs.net/doc/a49643813.html,或者WebService等等统统不行;有个名为“Print Spooler”的服务用于提供打印支持,若该服务不启动,则任何软件都不能进行打印,比如Word,记 事本或者报表软件等等。 Windows启动后在没有用户登录时就会启动Windows服务。Windows NT和Windows2000,以及更新的版本操作系统能运行Windows服务,但Windows98及其前期版本是不能运行服务的。 我们打开Windows资源管理器,在左边的树状列表中选中“桌面-控制面板-管理工具”。

在右边的列表中打开“服务”项目即可打开Windows服务管 理器。 在这些服务中,有我们最熟悉的IIS Admin和World Wide Web Publishing服务了。我们双击一个服务项目即可打开服务属性对话框。 Windows服务有一个服务名称属性,该属性是服务的惟一的不可重复的名称,我们可以在命令行中使用命令“net start 服务名称”来启动服务,使用“net stop 服务名称”来停止服务。Windows服务的启动类型有自动,手动和已禁用。当启动类型为自动时,Windows启动后不等用户登录就自动启动服务,当启动类型为手动时,需要某个操作员登录后点击这里的“启动”按钮来启动服务,而当启动类型为已禁用时,Windows 服务不能启动。 该页面中的“启动”按钮用于启动尚未启动的Windows服务,运行提供服务的进程;“停止”按钮用于停止已经启动的服务,杀死服务进程;而“暂停”按钮用于通知服务进程暂时停止提 供服务,但服务进程依然存在;而“恢复”按钮用于通知处于 暂停模式的服务进程重新提供服务。 我们可以查看服务属性对话框的“登录”页面。

c#开发和部署windows服务

c#开发和部署windows服务

c# 创建Windows服务 ( Installutil .exe方式加载 ) 一.Windows服务介绍: Windows服务以前被称作NT服务,是一些运行在Windows NT、Windows 2000和Windows XP等操作系统下用户环境以外的程序。在以前,编写Windows服务程序需要程序员很强的C或C++功底。然而现在在Visual https://www.360docs.net/doc/a49643813.html,下,你可以运用C++或Visual C#或Visual https://www.360docs.net/doc/a49643813.html,很轻松的创建一个Windows服务程序。同样,你还可以运用其他任何与CLR相容的语言来创建Windows服务程序。本文就向大家介绍如何运用Visual C#来一步一步创建一个文件监视的Windows服务程序,然后介绍如何安装、测试和调试该Windows服务程序。 在介绍如何创建Windows服务程序以前,我先向大家介绍一些有关Windows 服务的背景知识。一个Windows服务程序是在Windows操作系统下能完成特定功能的可执行的应用程序。Windows服务程序虽然是可执行的,但是它不像一般的可执行文件通过双击就能开始运行了,它必须有特定的启动方式。这些启动方式包括了自动启动和手动启动两种。对于自动启动的Windows服务程序,它们在Windows启动或是重启之后用户登录之前就开始执行了。只要你将相应的Windows服务程序注册到服务控制管理器(Service Control Manager)中,并将其启动类别设为自动启动就行了。而对于手动启动的Windows服务程序,你可以通过命令行工具的NET START 命令来启动它,或是通过控制面板中管理工具下的服务一项来启动相应的Windows服务程序(见图1)。同样,一个Windows 服务程序也不能像一般的应用程序那样被终止。因为Windows服务程序一般是没有用户界面的,所以你也要通过命令行工具或是下面图中的工具来停止它,或是在系统关闭时使得 Windows服务程序自动停止。因为Windows服务程序没有用户界面,所以基于用户界面的API函数对其是没有多大的意义。为了能使一个 Windows服务程序能够正常并有效的在系统环境下工作,程序员必须实现一系列的方法来完成其服务功能。Windows服务程序的应用范围很广,典型的Windows服务程序包含了硬件控制、应用程序监视、系统级应用、诊断、报告、Web和文件系统服务等功能。 二.创建Windows服务程序: 在介绍如何创建Windows服务程序以前,我先向大家介绍一下.Net框架下与Windows服务相关的命名空间和其中的类库。.Net 框架大大地简化了Windows 服务程序的创建和控制过程,这要归功于其命名空间中的功能强大的类库。和Windows服务程序相关的命名空间涉及到以下两个:System.ServiceProcess 和System.Diagnostics。 要创建一个最基本的Windows服务程序,我们只需要运用.Net框架下的System.ServiceProcess命名空间以及其中的四个类:ServiceBase、ServiceInstaller、ServiceProcessInstaller以及ServiceController. 其中 ServiceBase类定义了一些可被其子类重载的函数,通过这些重载的函数,服务控制管理器就可以控制该Windows服务程序了。这些函数包括:OnStart ()、OnStop()、OnPause()以及OnContinue()等四个。而且ServiceBase

创建Windows服务(Windows Services)N种方式总结

最近由于工作需要,写了一些windows服务程序,有一些经验,我现在总结写出来。 目前我知道的创建创建Windows服务有3种方式: a.利用.net框架类ServiceBase b.利用组件Topshelf c.利用小工具instsrv和srvany 下面我利用这3种方式,分别做一个windows服务程序,程序功能就是每隔5秒往程序目录下记录日志: a.利用.net框架类ServiceBase 本方式特点:简单,兼容性好 通过继承.net框架类ServiceBase实现 第1步: 新建一个Windows服务 public partial class Service1 : ServiceBase { readonly Timer _timer; private static readonly string FileName = Path.GetDirectoryName ( Assembly.GetExecutingAssembly ( ).Location ) + @"\" + "test.txt"; public Service1 ( ) { InitializeComponent ( ); _timer = new Timer ( 5000 ) { AutoReset = true , Enabled = true }; _timer.Elapsed += delegate ( object sender , ElapsedEventArgs e ) { this.witre ( string.Format ( "Run DateTime {0}", DateTime.Now ) ); }; } protected override void OnStart ( string [ ] args ) {

C#Windows服务开发

用Visual C#创建Windows服务程序 一.Windows服务介绍: Windows服务以前被称作NT服务,是一些运行在Windows NT、Windows 2000和Windows XP等操作系统下用户环境以外的程序。在以前,编写Windows服务程序需要程序员很强的C或C++功底。然而现在在Visual https://www.360docs.net/doc/a49643813.html,下,你可以运用C++或Visual C#或Visual https://www.360docs.net/doc/a49643813.html,很轻松的创建一个Windows服务程序。同样,你还可以运用其他任何与CLR相容的语言来创建Windows服务程序。本文就向大家介绍如何运用Visual C#来一步一步创建一个文件监视的Windows服务程序,然后介绍如何安装、测试和调试该Windows服务程序。 在介绍如何创建Windows服务程序以前,我先向大家介绍一些有关Windows服务的背景知识。一个Windows服务程序是在Windows操作系统下能完成特定功能的可执行的应用程序。Windows服务程序虽然是可执行的,但是它不像一般的可执行文件通过双击就能开始运行了,它必须有特定的启动方式。这些启动方式包括了自动启动和手动启动两种。对于自动启动的Windows服务程序,它们在Windows启动或是重启之后用户登录之前就开始执行了。只要你将相应的Windows服务程序注册到服务控制管理器(Service Control Manager)中,并将其启动类别设为自动启动就行了。而对于手动启动的Windows 服务程序,你可以通过命令行工具的NET START 命令来启动它,或是通过控制面板中管理工具下的服务一项来启动相应的Windows服务程序(见图1)。同样,一个Windows 服务程序也不能像一般的应用程序那样被终止。因为Windows服务程序一般是没有用户界面的,所以你也要通过命令行工具或是下面图中的工具来停止它,或是在系统关闭时使得Windows服务程序自动停止。因为Windows服务程序没有用户界面,所以基于用户界面的API函数对其是没有多大的意义。为了能使一个Windows服务程序能够正常并有效的在系统环境下工作,程序员必须实现一系列的方法来完成其服务功能。Windows服务程序的应用范围很广,典型的Windows服务程序包含了硬件控制、应用程序监视、系统级应用、诊断、报告、Web和文件系统服务等功能。 图1

如何编写一个Windows服务(一)-研发中心

如何编写一个Windows服务(一) 在Windows中,服务是一个特殊的程序,由服务管理器进行管理,允许在用户尚未登录的时候就启动。如果该程序意外终止,服务管理器会尝试重新启动该程序。 那么,如何写一个Windows服务呢?如果我想在Windows服务中使用Qt又要怎么做呢? 1.写一个服务的main函数 众所周知,C++程序以main函数作为程序的入口。 如果想要写一个服务,也需要一个函数作为服务程序的入口。 这个函数与main函数的定义是一样的: void WINAPI service_main(intargc, char** argv); 是的,写上这么一个函数作为服务的主函数就好了,函数内部无论你想做什么都可以。不过,因为我们写的是服务,所以一些和服务相关的功能我们应该注意:作为一个服务,告诉服务管理器自身的状态以及接受服务管理器的控制是最基本的吧。所以,一般情况下,我们会在服务的main函数中写上这么两个功能:注册一个服务管理函数,以及告知服务管理器自身已经启动了。 1.1.注册服务管理函数 服务管理函数的声明是这样的: void WINAPI ServiceHandler(DWORD fdwControl); 该函数的功能是,Windows的服务管理器会根据系统需要与用户的操作向服务发送一些请求,服务需要相应这些请求。其中,请求的类型就是这个函数的参数。知道了这个原理,那么我们一般情况下就会这么实现这个函数:

switch语句很好理解,case中的宏定义也能很轻松的明白是什么意思。 其中,ServiceStatus是一个“全局”的结构体,其定义如下: SERVICE_STATUS ServiceStatus; 也就是说,对于这个例子来说,我们只会响应服务管理器的停止与关闭消息,被粉色矩形框住的代码就是我们自己的程序退出逻辑——毕竟有些程序并不能直接的就被中止了,例如例子中,一旦服务器被关闭就会写入一个log。 好了,我们已经有了服务的管理函数,那么如何让服务管理器知道我们的服务有这么一个管理函数呢?只需要使用以下方式即可: hServiceStatusHandle = RegisterServiceCtrlHandler(TEXT(SERVICE_NAME), ServiceHandler);

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; //创 建文本文件对象 FileStream fs=new FileStream(strFileName,FileMode.OpenOrCreate,FileAccess.ReadWrite; //文件中写入 测试数据 fs.Write(content,0,content.Length; //关闭文件对象 fs.Close(; } 6.添加完相应的函数代码后,从代码视图切换到设计视图,点鼠标右键选择“添加安装程序” 7. 然后在当前项目资源管理器中会发现多了一个ProjectInstaller.cs文件,点击该文件打开ProjectInstaller.cs [设计]窗体.会发现里面自动有两个组件"serviceProcessInstaller1"和"serviceInstaller1" 8. 设置serviceInstaller1组件的属性:ServiceName = MyService(名 字自己随意修改的和 StartType = Automatic (开机自动运行方式 9. 设置serviceProcessInstaller1组件的属性:Account = LocalSystem 10. 选择当前解决方案,设置方案属性中的"启动项目"为刚才所添加的项目名称.按F5运行编译当前项目,会弹出一个对话框"无法从命令行或者调试器启动服务,必须首先安装Windows服务(使 用installutil.exe,然后用Server Explorer、Windows服务管理工具或NET START命令启动它"。错误没有关系,只要当前解决方案\项目文件夹\bin\Debug\文件夹下面多了一个EXE文件就好了. 至此自己需要的服务基本操作已经完成.剩下来的就是 编译.注册启动服务了. 11.Windows服务器注册停止打开CMD窗口--开始--运行-- 输入CMD,回车注册服务命令 cd

windows 7(win7)系统进程服务详解

windows 7(win7)系统进程服务详解 windows 7已经发布有段时间了,相信很多网友都已经换上了传说中非常完美的win7系统.win7不仅继承而且还超越了vista的美观界面,性能优化方面也下足了功力.还拥有强大的win xp兼容性,这使得很多XP用户都愿意将系统升级为windows 7,它在资源利用方面优化也是可圈可点,不像VISTA,让人感觉“缓慢”和“急躁”。本文就来给大家详解下win7的进程和服务,大家可以根据自己的需求关闭服务以提高win7系统运行速度。 不建议关闭或禁用的服务 AppID Service 确定应用程序的身份。该服务的默认运行方式是手动,不建议更改。 目标路径:\Windows\system32\svchost.exe -k LocalServiceAndNoImpersonation Application Experience 在应用程序启动时处理应用程序兼容型查询请求。该服务的默认运行方式是自动,不建议更改。 目标路径:\WINDOWS\system32\svchost.exe -k netsvcs 估计使用该技术之后在运行老程序的时候系统会自动选择相应的兼容模式运行,以便取得最佳效果。 Application Information 为应用程序的运行提供信息。该服务的默认运行方式是手动,不建议更改。 目标路径:\WINDOWS\system32\svchost.exe -k netsvcs Application Layer Gateway Service 为Internet 连接共享提供第三方协议插件的支持。该服务的默认运行方式是手动,如果你连接了网络,则该服务会自动启动,不建议更改。 目标路径:\WINDOWS\System32\alg.exe Background Intelligent Transfer Service 在后台传输客户端和服务器之间的数据。如果禁用了BITS,一些功能,如Windows Update,就无法正常运行。该服务的默认运行方式是自动,这个服务的主要用途还是用于进行Windows Update或者自动更新,最好不要更改这个服务。 目标路径:\WINDOWS\System32\svchost.exe -k netsvcs COM+ Event System 支持系统事件通知服务(SENS),此服务为订阅组件对象模型(COM)组件事件提供自动分布功能。如果停止此服务,SENS 将关闭,而且不能提供登录和注销通知。如果禁用此服务,显式依赖此服务的其他服务将无法启动。一个很原始的古老服务,该服务的默认运行方式为自动,这是一个重要的系统服务,设为手动也会自动运行,设为禁用好像也没什么影响,但是日志中会出现大量的错误。我们最好不要乱动。 目标路径:\WINDOWS\system32\svchost.exe -k netsvcs Cryptographic Services 提供三种管理服务:编录数据库服务,它确定Windows 文件的签字;受保护的根服务,它从此计算机添加和删除受信根证书机构的证书;和密钥(Key)服务,它帮助注册此计算机获取证书。如果此服务被终止,这些管理服务将无法正常运行。如果此服务被禁用,任何依赖它的服务将无法启动。维护和管理系统的所有证书,密钥以及安全数据库。另外访问一些网站所需要的服务,比如微软的网站,Windows Update,或者DRM的网站,很多时候它会提供和确认Windows文件的签名信息。强烈建议也是必须不能去动它,永远别

十步完成windows服务的安装

十步完成Windows服务的安装 可能是太过于懒惰的原因,研究个windows 服务的安装程序都花了大半天时间。在网上看了一些示例,大部分都言过其实,把过程搞得太过复杂,老是需要去研究如何利用InstallUtil.exe及其参数。事实上,既然要安装.net下制作的windows服务,肯定首先得在目标机器上安装有.net框架。因此,InstallUtil.exe也一定已经存在目标机器上了,因而利用微软的傻瓜式操作就能很好地解决windows服务安装和卸载的问题。 过一段时间估计还要狠狠地利用windows服务来完成一些功能,为了加深印象,又回过头弄了一个名叫HelloWorldService的windows服务,用最简单的demo来完成所有的操作。这个服务的功能,仅仅是在它启动的时候创建一个HelloWorld.txt文件,里边写上Hello World!这几个简单的字母而已。 1、选择Visual C#->Windows->Windows 服务,创建一个HelloWorldService 项目。 2、通过ServiceName更改服务的名称为”HelloWorldService“,这是最后在安装服务成功后在服务管理面板出现的名称。

3、将Service1.cs更名为HelloWorldService.cs,在其OnStart方法中写入简单的代码,用来实现创建文件并写入“Hello World!"这几个经典字母。

4、在HelloWorldService.cs的设计界面点右键,在弹出菜单中选择”添加安装程序“。

点击后出来的设计界面上添加了两个控件——ServiceProcessInstall和ServiceInstaller。 ServiceProcessInstall安装一个可执行文件,该文件包含扩展 ServiceBase 的类。该类由安装实用工具(如 InstallUtil.exe)在安装服务应用程序时调用。在这里主要是修改其Account属性。ServiceAccount指定服务的安全上下文,安全上下文定义其登录类型。

c#开发和部署windows服务

c# 创建Windows服务 ( Installutil .exe方式加载 ) 一.Windows服务介绍: Windows服务以前被称作NT服务,是一些运行在Windows NT、Windows 2000和Windows XP等操作系统下用户环境以外的程序。在以前,编写Windows服务程序需要程序员很强的C或C++功底。然而现在在Visual https://www.360docs.net/doc/a49643813.html,下,你可以运用C++或Visual C#或Visual https://www.360docs.net/doc/a49643813.html,很轻松的创建一个Windows服务程序。同样,你还可以运用其他任何与CLR相容的语言来创建Windows服务程序。本文就向大家介绍如何运用Visual C#来一步一步创建一个文件监视的Windows 服务程序,然后介绍如何安装、测试和调试该Windows服务程序。 在介绍如何创建Windows服务程序以前,我先向大家介绍一些有关Windows 服务的背景知识。一个Windows服务程序是在Windows操作系统下能完成特定功能的可执行的应用程序。Windows服务程序虽然是可执行的,但是它不像一般的可执行文件通过双击就能开始运行了,它必须有特定的启动方式。这些启动方式包括了自动启动和手动启动两种。对于自动启动的Windows服务程序,它们在Windows启动或是重启之后用户登录之前就开始执行了。只要你将相应的Windows服务程序注册到服务控制管理器(Service Control Manager)中,并将其启动类别设为自动启动就行了。而对于手动启动的Windows服务程序,你可以通过命令行工具的NET START 命令来启动它,或是通过控制面板中管理工具下的服务一项来启动相应的Windows服务程序(见图1)。同样,一个Windows 服务程序也不能像一般的应用程序那样被终止。因为Windows服务程序一般是没有用户界面的,所以你也要通过命令行工具或是下面图中的工具来停止它,或是在系统关闭时使得 Windows服务程序自动停止。因为Windows服务程序没有用户界面,所以基于用户界面的API函数对其是没有多大的意义。为了能使一个Windows服务程序能够正常并有效的在系统环境下工作,程序员必须实现一系列的方法来完成其服务功能。Windows服务程序的应用范围很广,典型的 Windows 服务程序包含了硬件控制、应用程序监视、系统级应用、诊断、报告、Web和文件系统服务等功能。 二.创建Windows服务程序: 在介绍如何创建Windows服务程序以前,我先向大家介绍一下.Net框架下与Windows服务相关的命名空间和其中的类库。.Net 框架大大地简化了Windows 服务程序的创建和控制过程,这要归功于其命名空间中的功能强大的类库。和Windows服务程序相关的命名空间涉及到以下两个:System.ServiceProcess 和System.Diagnostics。 要创建一个最基本的Windows服务程序,我们只需要运用.Net框架下的System.ServiceProcess命名空间以及其中的四个类:ServiceBase、ServiceInstaller、ServiceProcessInstaller以及ServiceController. 其中 ServiceBase类定义了一些可被其子类重载的函数,通过这些重载的函数,服务控制管理器就可以控制该Windows服务程序了。这些函数包括:OnStart ()、OnStop()、OnPause()以及OnContinue()等四个。而且ServiceBase 类的子类还可以重载 OnCustomCommand()函数来完成一些特定的操作。通过重

相关主题
相关文档
最新文档