打开VS2013,文件,新建,项目,选择ATL
名称自己随便取,确定
下一步
完成
移除ServiceDemoPS项目
核心代码
HRESULT InitializeSecurity() throw()
{
// TODO : 调用 CoInitializeSecurity 并为服务提供适当的安全设置
// 建议 - PKT 级别的身份验证、
// RPC_C_IMP_LEVEL_IDENTIFY 的模拟级别
// 以及适当的非 NULL 安全描述符。
//return S_OK;
return CoInitializeSecurity(NULL, -1, NULL, NULL,
RPC_C_AUTHN_LEVEL_NONE,
RPC_C_IMP_LEVEL_IDENTIFY,
NULL, EOAC_NONE, NULL);//创建安全说明符
}
HRESULT PreMessageLoop(int nShowCmd) throw()
{
//让服务允许暂停和继续操作
m_status.dwControlsAccepted = m_status.dwControlsAccepted | SERVICE_ACCEPT_PAUSE_CONTINUE
| SERVICE_ACCEPT_POWEREVENT | SERVICE_ACCEPT_SESSIONCHANGE;
HRESULT hr = __super::PreMessageLoop(nShowCmd);
if (hr == S_FALSE)
{
hr = S_OK;//这里有Bug,必须这样写,后面才能继续
}
//将服务状态设置为启动
SetServiceStatus(SERVICE_RUNNING);
//写入系统日志
LogEvent(L"ServiceDemo Service Start Successfully!");
return hr;
}
void Handler(_In_ DWORD dwOpcode) throw()
{
switch (dwOpcode)
{
case SERVICE_CONTROL_PAUSE://暂停
{
OnPause();
break;
}
case SERVICE_CONTROL_CONTINUE://继续
{
OnContinue();
break;
}
default:
break;
}
__super::Handler(dwOpcode);
}
void OnPause() throw()
{
//设置服务状态为暂停
SetServiceStatus(SERVICE_PAUSED);
__super::OnPause();
}
void OnStop() throw()
{
//设置服务状态为停止
SetServiceStatus(SERVICE_STOPPED);
__super::OnStop();
}
void OnContinue() throw()
{
//设置服务状态为启动
SetServiceStatus(SERVICE_RUNNING);
__super::OnContinue();
}
HRESULT RegisterAppId(_In_ bool bService = false) throw()
{
HRESULT hr = S_OK;
BOOL res = __super::RegisterAppId(bService);
if (bService)
{
if (IsInstalled())//服务已经安装
{
SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SERVICE_CHANGE_CONFIG);//打开服务管理器
SC_HANDLE hService = NULL;
if (hSCM == NULL)
{
hr = ATL::AtlHresultFromLastError();
}
else
{
//打开服务,m_szServiceName为基类成员变量,代表当前服务名称
//可以在资源文件列表的String Table中修改
hService = OpenService(hSCM, m_szServiceName, SERVICE_CHANGE_CONFIG);
if (hService != NULL)
{
//修改服务配置
ChangeServiceConfig(hService,
SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS,//独立进程、允许交互
SERVICE_AUTO_START,//服务自动启动
NULL, NULL, NULL, NULL, NULL, NULL, NULL,
m_szServiceName);
//服务描述信息
SERVICE_DESCRIPTION sDescription;
TCHAR szDescription[1024];
ZeroMemory(szDescription, 1024);
ZeroMemory(&sDescription, sizeof(SERVICE_DESCRIPTION));
//服务描述
lstrcpy(szDescription, _T("ServiceDemo测试服务"));
sDescription.lpDescription = szDescription;
//修改服务描述信息
ChangeServiceConfig2(hService, SERVICE_CONFIG_DESCRIPTION, &sDescription);
//关闭服务句柄
CloseServiceHandle(hService);
}
else
{
hr = ATL::AtlHresultFromLastError();
}
}
//关闭服务管理器句柄
::CloseServiceHandle(hSCM);
}
}
return hr;
}
以管理员身份,打开命令行,切到程序目录
ServiceDemo.exe /Service 注册服务
就可以看到刚刚注册的服务
net start ServiceDemo 启动服务
net stop ServiceDemo 停止服务
ServiceDemo.exe /UnRegServer 卸载服务