用 C++ 创建简单的 Win32 服务程序(2)

2016-02-19 16:40 11 1 收藏

今天图老师小编要跟大家分享用 C++ 创建简单的 Win32 服务程序(2),精心挑选的过程简单易学,喜欢的朋友一起来学习吧!

【 tulaoshi.com - 编程语言 】

CNTService 类  当我创建 C++ 对象封装 Windows 函数时,我尝试为我封装的每个 Windows API 除了创建成员函数外,还做一些别的工作,我尝试让对象更容易使用,降低实现特定项目所需的代码行数。因此我的对象是基于我想让这个对象做什么?而不是Windows 用这些 APIs 做什么?  CNTService 类包含一些用来解析命令行的成员函数,为了处理服务的安装和拆卸以及事件日志的记录,你得在派生类中重写一些虚拟函数来处理服务控制管理器的请求。下面我们将通过本文的例子服务实现来研究这些函数的使用。  如果你想创建尽可能简单的服务,只需要重写 CNTService::Run 即可,它是你编写代码实现具体服务任务的地方。你还需要实现 main 函数。如果服务需要实现一些初始化。如从注册表读取数据,还需重写 CNTService::OnInit。如果你要向服务发送命令消息 ,那么可以在服务中使用系统函数 ControlService,重写 CNTService::OnUserControl 来处理请求。在例子应用程序中使用 CNTService  NTService 在 CMyService 类中实现了它的大多数功能,CMyService 由 CNTService 派生。 MyService.h 头文件如下:
// myservice.h #include "ntservice.h" class CMyService : public CNTService { public:   CMyService();   virtual BOOL OnInit();   virtual void Run();   virtual BOOL OnUserControl(DWORD dwOpcode);   void SaveStatus();   // Control parameters   int m_iStartParam;   int m_iIncParam;   // Current state   int m_iState; };

  正像你所看到的,CMyService 改写了 CNTService 的 OnInit、Run 和 OnUserControl。它还有一个函数叫 SaveStatus,这个函数被用于将数据写入注册表,那些成员变量用来保存当前状态。例子服务每隔一定的时间对一个整型变量进行增量处理。开始值和增量值都存在注册表的参数中。这样做并没有别的意图。只是为了简单示范。下面我们看看这个服务是如何实现的。 实现 main 函数有了从 CNTService 派生的 CMyService,实现 main 函数很简单,请看 NTServApp.cpp 文件:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)
int main(int argc, char* argv[]) {   // 创建服务对象   CMyService MyService;     // 解析标准参数 (安装, 卸载, 版本等.)   if (!MyService.ParseStandardArgs(argc, argv)) {     // 未发现任何标准参数,所以启动服务,     // 取消下面 DebugBreak 代码行的注释,     // 当服务启动后进入调试器,     //DebugBreak();     MyService.StartService();   }   // 到这里,服务已经停止   return MyService.m_Status.dwWin32ExitCode; }
  这里代码不多,但执行后却发生了很多事情,让我们一步一步来看。首先,我们创建一个 MyService 类的实例。构造函数设置初始化状态和服务名字(MyService.cpp):
CMyService::CMyService():CNTService("NT Service Demonstration") {   m_iStartParam = 0;   m_iIncParam = 1;   m_iState = m_iStartParam; }

  接着调用 ParseStandardArgs 检查命令行是否包含服务安装(-i)、卸载(-u)以及报告其版本号(-v)的请求。CNTService::ParseStandardArgs 分别调用 CNTService::IsInstalled,CNTService::Install 和 CNTService::Uninstall 来处理这些请求。如果没有可识别的命令行参数,则假设该服务控制管理器试图启动该服务并调用 StartService。该函数直到服务停止运行才返回。当你调试完代码,即可把用于调试的代码行注释掉或删除。安装和卸载服务  服务的安装由 CNTService::Install 处理,它用 Win32 服务管理器注册服务并在注册表中建立一个条目以支持服务运行时日志消息。  服务的卸载由 CNTService::Uninstall 处理,它仅仅通知服务管理器该服务已经不再需要。CNTService::Uninstall 不会删除服务实际的可执行文件。 编写服务代码  现在我们来编写实现服务的具体代码。对于 NTService 例子,有三个函数要写。他们涉及初始化,运行服务的细节和响应控制请求。初始化  注册表有一个给服务用来存储参数的地方:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServices

  我就是选择这里来存储我的服务配置信息。我创建了一个 Parameters 键,并在此存储我要保存的值。所以当服务启动时,OnInit 函数被调用;这个函数从注册表中读取初始设置。

                        

来源:http://www.tulaoshi.com/n/20160219/1612701.html

延伸阅读
    Tray(托盘)是Windows9x任务条上的一个非凡区域,它的技术名称为“任务栏布告区”,一些软件(如金山词霸Ⅲ)运行时会在托盘上放置一个图标,使用户一眼就能知道这个程序正在后台运行,要想激活它也很轻易,通常只需单击一下这个图标即可,非常方便。 Tray的编程比较非凡,但并不难,主要包括图标、工具提示和消...
标签: 电脑入门
有用户在双击安装某个软件时,经常会弹出XXX.EXE不是有效Win32应用程序的错误提示。 当然,有时即使我们双击运行任意一个EXE格式的可执行文件,同样会出现这样的错误提示。那么如何才能够避免系统出现不是有效Win32应用程序问题呢。 如果仅仅是在安装某些软件时,才弹出错误信息,这说明我们安装的程序包不完整或者是程序安装不成功,此时可...
一位网友正在学校做课程设计题目,要求在一个文件中找到给定单词出现的位置并统计出现次数。这是一个比较简单的文本处理问题, 于是, 我给他用 python 写了一个,并打赌在5分钟内用不到30行程序解决问题。 下面是程序: if __name__=='__main__': file_name = raw_input('Input the file you want to find in:') ...
众 所 周 知, 在Windows95/98 的Win32 on Intel x86 体 系 中 利 用 了 处 理 器 的 三 环 保 护 模 型 中 的 零 环(Ring0, 最 高 权 限 级 别) 和 三 环(Ring3, 最 低 权 限 级 别)。 一 般 应 用 程 序 都 运 行 在Ring3 下, 受 到 严 格 的" 保 护", 只 能 规 矩 地 使 用Win32API。 如 果 我 们 想 进 行 一 些 系 ...
青苹果工作室2001年04月27日 17:58 Windows服务在Visual Studio 以前的版本中叫NT服务,在VS.net启用了新的名称。用Visual C# 创建Windows服务不是一件困难的事,本文就将指导你一步一步创建一个Windows服务并使用它。这个服务在启动和停止时,向一个文本文件中写入一些文字信息。这个小技巧来自于MSDN,但是现在程序编写的更加清晰,并且你可...