您的位置:首页 > 其它

Windows ATL Service 服务的创建(VS2010)

2015-06-06 16:30 627 查看
1 使用VS2010床加一个ATL服务项目

第一步



第二步



第三步



创建好之后,

重写父类的以下方法

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那个错误,值得注意
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  vs2010 service