用 C++ 创建简单的 Win32 服务程序(2)
2006-04-09 11:41:10 来源:WEB开发网核心提示: int main(int argc, char* argv[]) { // 创建服务对象 CMyService MyService;// 解析标准参数 (安装, 卸载, 版本等.) if (!MyService.ParseStandardArgs(argc, argv)) {// 未发现任
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 例子,有三个函数要写。他们涉及初始化,运行服务的细节和响应控制请求。
初始化
注册表有一个给服务用来存储参数的地方:
更多精彩
赞助商链接