Windows ATL Service 服务的创建(VS2010)
2015-06-06 16:30
627 查看
1 使用VS2010床加一个ATL服务项目
第一步
第二步
第三步
创建好之后,
重写父类的以下方法
使用cmd切换到项目输出目录,使用程序名.exe /Service
然后打开服务管理页面,就可以看到我们刚才安装的服务了
启动服务会出现
这个错误已经有人解决了,我们安装这个方法修改后,重新编程程序,再次使用 程序名.exe /Service 命令安装服务,然后在服务管理器中启动服务,运行了比较久出现如下错误
这个问题有人解决了,参考修改后,重新编译下代码,就可以了
我花了半天时间才写出来。1053那个错误,值得注意
第一步
第二步
第三步
创建好之后,
重写父类的以下方法
HRESULT RegisterAppId(bool bService = false) throw (); void ServiceMain(DWORD dwArgc, LPTSTR* lpszArgv); HRESULT PostMessageLoop(); void Handler(DWORD dwOpcode); void OnStop(); void OnPause(); void OnContinue(); void OnInterrogate(); void OnShutdown(); HRESULT PreMessageLoop(int nShowCmd);
全部代码如下
// MyService.cpp : WinMain 的实现 #include "stdafx.h" #include "resource.h" #include "MyService_i.h" #include <stdio.h> class CMyServiceModule : public ATL::CAtlServiceModuleT< CMyServiceModule, IDS_SERVICENAME > { public : DECLARE_LIBID(LIBID_MyServiceLib) DECLARE_REGISTRY_APPID_RESOURCEID(IDR_MYSERVICE, "{38D52E46-9042-4AC9-9D57-4A13E350B4EF}") HRESULT InitializeSecurity() throw() { // TODO : 调用 CoInitializeSecurity 并为服务提供适当的安全设置 // 建议 - PKT 级别的身份验证、 // RPC_C_IMP_LEVEL_IDENTIFY 的模拟级别 // 以及适当的非 null 安全说明符。 return S_OK; } HRESULT RegisterAppId(bool bService = false) throw (); void ServiceMain(DWORD dwArgc, LPTSTR* lpszArgv); HRESULT PostMessageLoop(); void Handler(DWORD dwOpcode); void OnStop(); void OnPause(); void OnContinue(); void OnInterrogate(); void OnShutdown(); HRESULT PreMessageLoop(int nShowCmd); }; CMyServiceModule _AtlModule; // extern "C" int WINAPI _tWinMain(HINSTANCE /*hInstance*/, HINSTANCE /*hPrevInstance*/, LPTSTR /*lpCmdLine*/, int nShowCmd) { return _AtlModule.WinMain(nShowCmd); } HRESULT CMyServiceModule::RegisterAppId(bool bService ) throw () { HRESULT hr = S_OK; BOOL res = __super ::RegisterAppId(bService); if (bService) { if (IsInstalled()) { SC_HANDLE hSCM = ::OpenSCManagerW(NULL, NULL, SERVICE_CHANGE_CONFIG); SC_HANDLE hService = NULL; if (hSCM == NULL) { hr = ATL::AtlHresultFromLastError(); } else { hService = ::OpenService(hSCM, m_szServiceName, SERVICE_CHANGE_CONFIG); if (hService != NULL) { ::ChangeServiceConfig(hService, SERVICE_NO_CHANGE, SERVICE_AUTO_START,// 修改服务为自动启动 NULL, NULL, NULL, NULL, NULL, NULL, NULL, m_szServiceName); // 通过修改资源IDS_SERVICENAME 修改服务的显示名字 SERVICE_DESCRIPTION Description; TCHAR szDescription[1024]; ZeroMemory(szDescription, 1024); ZeroMemory(&Description, sizeof (SERVICE_DESCRIPTION)); lstrcpy(szDescription, _T("测试服务描述信息" )); Description.lpDescription = szDescription; ::ChangeServiceConfig2(hService, SERVICE_CONFIG_DESCRIPTION, &Description); ::CloseServiceHandle(hService); } else { hr = ATL::AtlHresultFromLastError(); } ::CloseServiceHandle(hSCM); } } } return hr; } void CMyServiceModule::ServiceMain(DWORD dwArgc, LPTSTR* lpszArgv) { // TODO: 在此添加专用代码和/或调用基类 //log(_T("invoke methode ServcieMain\n")); __super::ServiceMain(dwArgc,lpszArgv); //CAtlServiceModuleT::ServiceMain(dwArgc, lpszArgv); } HRESULT CMyServiceModule::PostMessageLoop() { // TODO: 在此添加专用代码和/或调用基类 //log(_T("invoke methode POstMessageLoop\n")); return CAtlServiceModuleT::PostMessageLoop(); } void CMyServiceModule::Handler(DWORD dwOpcode) { // TODO: 在此添加专用代码和/或调用基类 //log(_T("invoke methode Handler with parameter\n")); __super::Handler(dwOpcode); } void CMyServiceModule::OnStop() throw() { //log(_T("invoke OnStop\n")); // m_serverListener.stopServer(); //log("停止服务监听"); __super::OnStop(); } void CMyServiceModule::OnPause() throw() { //log(_T("invoke OnPause\n")); __super::OnPause(); } void CMyServiceModule::OnContinue() throw() { //log(_T("invoke OnContinue\n")); __super::OnContinue(); } void CMyServiceModule::OnInterrogate() throw() { //log(_T("invoke OnInterrogate\n")); __super::OnInterrogate(); } void CMyServiceModule::OnShutdown() throw() { //log(_T("invoke OnShutdown\n")); __super::OnShutdown(); } HRESULT CMyServiceModule::PreMessageLoop(int nShowCmd) { // TODO: 在此添加专用代码和/或调用基类 HRESULT res= CAtlServiceModuleT::PreMessageLoop(nShowCmd); //log(_T("invoke method PreMessageLoop\n")); if(SUCCEEDED(res)){ //SetServiceStatus(SERVICE_RUNNING); //m_serverListener.startServer(); //log("启动服务监听"); } return res; }
使用cmd切换到项目输出目录,使用程序名.exe /Service
然后打开服务管理页面,就可以看到我们刚才安装的服务了
启动服务会出现
这个错误已经有人解决了,我们安装这个方法修改后,重新编程程序,再次使用 程序名.exe /Service 命令安装服务,然后在服务管理器中启动服务,运行了比较久出现如下错误
这个问题有人解决了,参考修改后,重新编译下代码,就可以了
我花了半天时间才写出来。1053那个错误,值得注意
相关文章推荐
- Android IPC进程间通讯机制
- android之定时器AlarmManager
- axis备忘
- Windows XP Service Pack 3 RC1 v.3244 winxp补丁3 提供下载
- Run As Service runassrv.exe 详细参数第1/2页
- 安装MySQL在最后的start service停住了解决方法
- android使用Messenger绑定Service的多种实现方法
- 关于vs2005、vs2008和vs2010项目互转的总结
- asp.net Web Service 接口大量数据传输解决方案
- vs2010根据字符串内容添加断点的方法介绍
- Silverlight中动态获取Web Service地址
- 在vs2010中调试javascript代码方法
- android调用web service(cxf)实例应用详解
- 在Android中 获取正在运行的Service 实例
- VS2010写的程序在自己电脑可以运行、其他电脑上不能运行的解决方案
- ASP.NET State service状态服务的问题解决方法
- 卸载ZkeysPHP 后iis网站出现Service Unavailable 解决办法
- IIS Admin Service 服务因 2149647636 (0x80210514) 服务性错误而停止
- Service Temporarily Unavailable的503错误是怎么回事?
- VS2010 C++ 配置优化方案