今天图老师小编要跟大家分享用 C++ 创建简单的 Win32 服务程序(2),精心挑选的过程简单易学,喜欢的朋友一起来学习吧!
【 tulaoshi.com - 编程语言 】
// 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 文件:
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 例子,有三个函数要写。他们涉及初始化,运行服务的细节和响应控制请求。初始化 注册表有一个给服务用来存储参数的地方:
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServices
我就是选择这里来存储我的服务配置信息。我创建了一个 Parameters 键,并在此存储我要保存的值。所以当服务启动时,OnInit 函数被调用;这个函数从注册表中读取初始设置。
(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)来源:http://www.tulaoshi.com/n/20160219/1612701.html
看过《用 C++ 创建简单的 Win32 服务程序(2)》的人还看了以下文章 更多>>