前几天面试,被问到这个问题,当时我说“没用vc做过,可能在.Net下面做比较简单吧,因为记得库里面好像封装了一下了”因为我记得以前的一个网站测试的一个项目好像也有这么一个工具的。 今天又看到有人在百度知道问这个问题,于是就看了一下。在网上搜索一下,资料还是比较多的。 回来用vc2008试了一下,如下: 新建一个 ATL 项目-》 选择创建一个“服务”类型的ATL 项目,将生成如下代码, // widebright_service.cpp : WinMain 的实现
#include <stdio.h> class Cwidebright_serviceModule : public CAtlServiceModuleT< Cwidebright_serviceModule, IDS_SERVICENAME > //重写这个函数来启动任务啦 hr = __super::PreMessageLoop(nShowCmd); if (hr == S_OK) LogEvent(_T("widebright 的服务启动咯,呵呵 ")); if (SUCCEEDED(hr)) return hr; Cwidebright_serviceModule _AtlModule;
//
紫色部分代码是自己添加上去,可以看到 CAtlServiceModuleT (http://msdn.microsoft.com/en-us/library/hkhzk29d(VS.80).aspx) 类已经把所有的东西封装的比较完整了。 我只要根据需要重写相应的函数来实现自己想要的功能就行了,比如你想创建的“服务”随系统启动,可以重写CAtlServiceModuleT 的Install函数,把里面的CreateService函数的参数修改一下,具体可以去MSDN上查找CreateService这个API的说明。 如果想处理服务 停止和启动的动作,可以参考CAtlServiceModuleT 的源代码重写OnStop ()等函数。我上面简单到重写了Run函数,输出一条“事件”其实具体 工作是可以放到这里来完成的吧。 编译,生成程序之后就可以测试了, 执行“widebright_service -/Service” 就可以把服务注册到系统了,命令行参数其实是在CAtlServiceModuleT::ParseCommandLine 这个函数里面处理,可以去看一下,必要的话重写也是可以的,加上调用 UnInstall来删除服务的代码也很不错的吧。 注册后,就看用“sc start” 或者“net start” 等命令来操纵服务了。在“服务”控制器里面控制与可以:如图
![]()
在 “事件查看器”中可以看到自己的服务生成 到事件。
注意: 我测试时需要添加_ATL_NO_COM_SUPPORT这个宏的标志,才能正确运行到Run函数里面,好像是com初始化的时候失败了如果没有定义这个的话。 // stdafx.h : 标准系统包含文件的包含文件, #pragma once #ifndef STRICT #include "targetver.h" #define _ATL_NO_COM_SUPPORT #define _ATL_APARTMENT_THREADED #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // 某些 CString 构造函数将是显式的 #include "resource.h" using namespace ATL; 参考: 关于Windows服务的详细信息看到MSDN上搜索“windows service",可以找到原理,和控制接口等相关编程用法。 VC知识库文章- 用C 语言编写Windows 服务程序的五个步骤 http://www.vckbase.com/document/viewdoc/?id=1474 http://www.vckbase.com/document/listdoc.asp?sclsid=1319 等都是不错的参考资料 |
VC2008中编写“Windows服务”
最新推荐文章于 2023-02-26 18:34:16 发布
VC2008中编写“Windows服务”(Windows Service)程序
2008年10月31日 星期五 01:14