用 C++ 创建简单的 Win32 服务程序(2)
敬业的IT人
互联网
佚名
2008-1-3 19:36:04
- 如何重装xp系统图解
- 下载Flash播放插件
- 巧妙清除Windows 2000/XP登录密码
- 如何利用路由器设置局域网
- QQ空间打不开
- 开机后鼠标不动怎么办
- Excel密码保护的解除方法与解除原理
- Windows XP注册表详解
- 3dmax不锈钢金属材质的制作方法
- 硬盘变成raw格式怎么办
当我创建 C++ 对象封装 Windows 函数时,我尝试为我封装的每个 Windows API 除了创建成员函数外,还做一些别的工作,我尝试让对象更容易使用,降低实现特定项目所需的代码行数。因此我的对象是基于“我想让这个对象做什么?”而不是“Windows 用这些 APIs 做什么?”
CNTService 类包含一些用来解析命令行的成员函数,为了处理服务的安装和拆卸以及事件日志的记录,你得在派生类中重写一些虚拟函数来处理服务控制管理器的请求。下面我们将通过本文的例子服务实现来研究这些函数的使用。
如果你想创建尽可能简单的服务,只需要重写 CNTService::Run 即可,它是你编写代码实现具体服务任务的地方。你还需要实现 main 函数。如果服务需要实现一些初始化。如从注册表读取数据,还需重写 CNTService::border="0" alt="用 C++ 创建简单的 Win32 服务程序(2)" width="14" height="16" /> 实现 main 函数
有了从 CNTService 派生的 CMyService,实现 main 函数很简单,请看 NTServApp.cpp 文件:通告: 编写服务代码
现在我们来编写实现服务的具体代码。对于 NTService 例子,有三个函数要写。他们涉及初始化,运行服务的细节和响应控制请求。
初始化
注册表有一个给服务用来存储参数的地方:通告: 调试 Win32 服务
main 函数中包含一个对 DebugBreak 的调用,当服务第一次被启动时,它会激活系统调试器。你可以监控来自调试器命令窗口中的服务调试信息。你可以在服务中用 CNTService::DebugMsg 来报告调试期间感兴趣的事件。
为了调试服务代码,你需要按照 Platform SDK 文档中的要求安装 系统调试器(WinDbg)。你也可以用 Visual Studio 自带的调试器调试 Win32 服务。
有一点很重要,那就是 当它被服务管理器控制时,你不能终止服务和单步执行,因为服务管理器会让服务请求 超时并终止服务线程。所以你只能让服务吐出消息,跟踪其过程并在调试器窗口查看它们。
当服务启动后(例如,从控制面板的“服务”中),调试器将在服务线程的挂起后启动。你需要通过单击“Go”按钮或按 F5 让继续运行。然后在调试器中观察服务的运行过程。
下面是启动和终止服务的调试输出例子:
Module Load: WinDebug/NTService.exe (symbol loading deferred) Thread Create: Process=0, Thread=0 Module Load: C:\NT351\system32\NTDLL.DLL (symbol loading deferred) Module Load: C:\NT351\system32\KERNEL32.DLL (symbol loading deferred) Module Load: C:\NT351\system32\ADVAPI32.DLL (symbol loading deferred) Module Load: C:\NT351\system32\RPCRT4.DLL (symbol loading deferred) Thread Create: Process=0, Thread=1 *** WARNING: symbols checksum is wrborder="0" alt="用 C++ 创建简单的 Win32 服务程序(2)" width="14" height="16" /> 总结
也许用 C++ 创建 Win32 服务并不是最理想的,但使用单一的类来派生你自己的服务的确方便了你的服务开发工作。收藏地址:进入讨论组讨论。
- 最新文章
- C++程序员快速学习C#之二[01-03]
- C++程序员快速学习C#之一[01-03]
- C++程序员快速学习C#之三[01-03]
- 高质量C++/C编程指南--函数设计[01-03]
- 涅磐重生 C++内存管理变革[01-03]
- C++ Builder控件版[01-03]
- 相关文章
