没有合适的资源?快使用搜索试试~ 我知道了~
首页C++创建window服务
C++创建window服务
![](https://csdnimg.cn/release/wenkucmsfe/public/img/star.98a08eaa.png)
本文描述如何用 Visual C++ 创建 Windows NT 服务程序。创建该服务仅用到一个 C++ 类,这个类提供服务与操作系统之间一个简单的接口。使用这个类实现自己的服务非常简单,只要改写少数几个基类中的虚拟函数即可。在本文有三个源代码参考例子: • NTService 是一个简单的 Win32 服务,它就是用本文所描述的方法建立的; • NTServCpl 是一个控制面版程序,用来控制 NTService 服务; • NTServCtrl 是一个独立的程序例子,用它可以监控某个 Win32 服务;
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/4014932/bg1.jpg)
新一篇:用 C 语言编写 Windows 服务程序的五个步骤 |旧一篇:用 VC 建立 Windows 服务程序
用 C++ 创建简单的 Win32 服务程序
作者:Nigel Thomson(MSDN 技术组)
翻译:NorthTibet
原文出处:Creating a Simple Win32 Service in C++
下载 NTService 例子源代码
下载 NTServCpl 例子源代码
下载 NTServCtrl 例子源代码
摘要
本文描述如何用 Visual C++ 创建 Windows NT 服务程序。创建该服务仅用到一个
C++ 类,这个类提供服务与操作系统之间一个简单的接口。使用这个类实现自己的服务
非常简单,只要改写少数几个基类中的虚拟函数即可。在本文有三个源代码参考例子:
NTService 是一个简单的 Win32 服务,它就是用本文所描述的方法建立的;
NTServCpl 是一个控制面版程序,用来控制 NTService 服务;
NTServCtrl 是一个独立的程序例子,用它可以监控某个 Win32 服务;
简介
Windows NT 中的服务实际上是一个程序,只要计算机操作系统一启动,服务就可以
运行其中。它不需要用户登陆。服务程序是一种与用户无关的任务,比如目录复制,进程
监控或网络上供其它机器使用的服务,比如 HTTP 协议支持。
创建 Windows NT 服务程序并不是很难。但调试某个服务程序不是一件容易的事。
就我自己而言,我喜欢用 Visual C++ 编写自己的 C++ 程序。大多数 Win32 服务都是
用 C 写的,所以我觉得如果用某个 C++ 类来实现 Win32 服务的基本功能一定很有意思。
有了这个 C++ 类,谁要想用 C++ 创建 Win32 服务就是一件很简单的事情了。我为此
开发了一个 C++ 基类,用它作为编写 Win32 服务的起点应该没有什么大问题。
创建服务程序除了编写服务代码外,还必须做一些其它额外的编码工作:
在系统日志或应用程序日志中报告警告信息和出错信息,不能用输出到屏幕的方式,因为用户根
本就没有登陆。
服务程序的控制即可以通过单独的应用程序,也可以通过控制面版程序。这取决于你的服务实现
什么样的通讯机制。
从系统中安装和卸载服务
![](https://csdnimg.cn/release/download_crawler_static/4014932/bg2.jpg)
大多数服务程序都是使用一个安装程序来安装,而用另外一个程序来卸载。本文
我将这些功能内建在服务程序自身当中,使之一体化,这样只分发一个.EXE 文件即可。
你可以从命令行直接运行服务程序,并且可以随心所欲地安装和卸载或报告其版本信息 。
NTService 支持下列的命令行参数:
-v, 报告服务的名字和版本号;
-i, 安装服务;
-u, 卸载服务;
默认情况下,当系统启动该服务时没有命令行参数传递。
创建应用程序框架
我一直都是创建基于 MFC 的应用程序。当我刚接触 Win32 服务程序时,我先是用
Visual C++ AppWizard 创建一个 SDI/MFC 程序。然后去掉其中的文档和视图类、图标
以及其它一些无用的东西,只剩下框架。结果到最后什么都去掉了,包括主窗口(服务程
序不能有这个东东),什么也没有留下,非常愚蠢。我不得不 又回过头到 AppWizard,
并用单个的源文件创建控制台程序,此源文件包含 main 入口函数,我将这个文件命名为
NTServApp.cpp。我用此 cpp 扩展而不是用 C,因为我只想用 C++ 来写程序,而不是
直接用 C。稍后我们会讨论该文件代码实现。
因为我想用 C++ 类来构建服务,所以我创建了 NTService.h 和 NTService.cpp 文
件,用它们来实现 CNTService 基类。我还创建了 MyService.h 和 MyService.cpp 文
件用于实现自己的服务类(CMyService),它派生于 CNTService。稍后我们会看到代
码。
建立新工程时,我喜欢尽快看到运行结果,所以我决定服务程序要做的第一件事情是
建立一个系统应用程序日志记录。借助这个日志记录机制,我能跟踪服务何时启动, 何时
停止等等。我还可以记录服务中发生的任何出错信息。创建这个日志记录比我想象的要复
杂得多。
建立日志记录
我想,既然日志文件是操作系统的一部分,那么肯定有应用程序编程接口(API)来
支持建立日志记录。所以我开始搜索 MSDN CD,直到发现 ReportEvent 函数为止。如
果你不熟悉这个函数,你可能会想,这个函数应该知道在哪个日志文件建立记录,以及你
想要插入的文本信息。没错,这都是它要做的事情,但是为了简化出错信息的国际化,该
函数有一个消息 ID 作为参数,并在你提供的消息表中查找消息。所以问题无非是你想将
什么消息放入日志,以及如何将这些消息添加到你的应用程序中,下面我们一步一步来做
1. 以 .MC 为扩展名创建一个包含消息描述的文本文件。我将它命名为 NTServMsg.mc。该文件
的格式非常特别,具体细节参见 Platform SDK 文档;
2. 针对你的源文件运行消息编译器(mc.exe),默认情况下它创建名为 MSG00001.BIN 的输
出文件。编译器还创建一个头文件(在我的例子程序中,该头文件是 NTServMsg.h)和一个.RC
![](https://csdnimg.cn/release/download_crawler_static/4014932/bg3.jpg)
文件(NTServMsg.rc)。只要你修改工程的 .MC 文件就必须重复这一步,所以把工具加到
Visual C++ 的工具菜单里做起来会很方便;
3. 为工程创建一个 .RC 文件,将 WINDOWS.H 头文件以及消息编译器产生的 .RC 文件包含到其
中;
4. 在主工程头文件中包含消息编译器产生的头文件,以便模块可以存取符号消息名;
下面让我们仔细一下这些文件,以便弄明白你自己需要创建什么,以及消息编译
器要为你创建些什么。我们不用研究整个消息集,只要看看其中一二个如何工作的即可。
下面是例子程序消息源文件 NTServMsg.mc 的第一部分:
MessageId=100
SymbolicName=EVMSG_INSTALLED
Language=English
The %1 service was installed.
.
MessageId=
SymbolicName=EVMSG_REMOVED
Language=English
The %1 service was removed.
.
MessageId=
SymbolicName=EVMSG_NOTREMOVED
Language=English
The %1 service could not be removed.
.
每一条都有一个消息 ID,如果不特别设置,那么 ID 的取值就是指其前面所赋的
值。每一条还有一个代码中使用的符号名,语言标示符以及消息文本。消息可以跨多个行
并用含有一个句号的单独一行终止。
消息编译器输出一个库文件,该库文件被用作应用程序的资源,此外还输出两个要在
代码中包含的文件。下面是我的 .RC 文件:
![](https://csdnimg.cn/release/download_crawler_static/4014932/bg4.jpg)
// NTServApp.rc
#include <windows.h>
// 包含由消息编译器(MC)产生的消息表资源脚本
#include "NTServMsg.rc"
Here''s the .RC @le the message compiler generated:
LANGUAGE 0x9,0x1
1 11 MSG00001.bin
正像你所看到的,这些文件中内容不多!
消息编译器产生的最后一个文件是你要包含到代码中的头文件,下面就是这个头文件的部
分内容:
[..........]
//
// MessageId: EVMSG_INSTALLED
//
// MessageText:
//
// The %1 service was installed.
//
#de@ne EVMSG_INSTALLED 0x00000064L
//
// MessageId: EVMSG_REMOVED
//
// MessageText:
//
// The %1 service was removed.
剩余15页未读,继续阅读
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)