是用一个类封装静态函数实现的.
头文件:
class CService
{
public:
CService(tstring _ServiceName);
virtual ~CService(void);
static void WINAPI Process(); //逻辑实现
static void WINAPI Service_Main(); //主函数入口
static void WINAPI Service_Ctrl(DWORD _Ctrl); //控制函数入口
//调用服务安装服务
static BOOL InstallService();
//调用服务卸载服务
static BOOL UninstallService();
//调用服务监测服务是否以及安装
static BOOL IsServiceInstalled();
//调用服务管理器开始服务
static BOOL StartService();
//调用服务管理器停止服务
static BOOL StopService();
static void Log(tstring _logText);
public:
//服务名称
static tstring mServiceName;
//事件句柄
static HANDLE mhServiceEvent;
//服务状态
static SERVICE_STATUS mStatus;
//服务状态句柄
static SERVICE_STATUS_HANDLE mhStatus;
};
cpp文件:
#include "StdAfx.h"
#include "CService.h"
#include <Wtsapi32.h>
#pragma comment(lib ,"Wtsapi32.lib")
#include <Userenv.h>
#pragma comment(lib,"Userenv.lib")
tstring CService::mServiceName = _T("EMinder");
HANDLE CService::mhServiceEvent;
SERVICE_STATUS CService::mStatus;
SERVICE_STATUS_HANDLE CService::mhStatus;
CService::CService(tstring _ServiceName)
{
}
CService::~CService(void)
{
}
BOOL CService::InstallService()
{
SERVICE_TABLE_ENTRY st[] =
{
{ CService::mServiceName, (LPSERVICE_MAIN_FUNCTION)CService::Service_Main }, { NULL, NULL }
};
BOOL s = StartServiceCtrlDispatcher(st);
if (IsServiceInstalled())
{
return TRUE;
}
//打开服务控制管理器
SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (hSCM == NULL)
{
return FALSE;
}
// Get the executable file path
tstring moduleFileName = GetModulName();
//创建服务
SC_HANDLE hService = ::CreateService(
hSCM,
mServiceName.c_str(),
mServiceName.c_str(),
SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS,
SERVICE_AUTO_START, //如果为SERVICE_DEMAND_START则表示此服务需手工启动
SERVICE_ERROR_NORMAL,
moduleFileName.c_str(),
NULL,
NULL,
_T(""),
NULL,
NULL);
if (hService == NULL)
{
::CloseServiceHandle(hSCM);
return FALSE;
}
::CloseServiceHandle(hService);
::CloseServiceHandle(hSCM);
return TRUE;
}
BOOL CService::UninstallService()
{
if (!IsServiceInstalled())
{
return TRUE;
}
SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (hSCM == NULL)
{
return FALSE;
}
SC_HANDLE hService = ::OpenService(hSCM, mServiceName.c_str(), SERVICE_STOP | DELETE);
if (hService == NULL)
{
::CloseServiceHandle(hSCM);
return FALSE;
}
SERVICE_STATUS status;
::ControlService(hService, SERVICE_CONTROL_STOP, &status);
//删除服务
BOOL bDelete = ::DeleteService(hService);
::CloseServiceHandle(hService);
::CloseServiceHandle(hSCM);
if (bDelete)
{
return TRUE;
}
return FALSE;
}
BOOL CService::IsServiceInstalled()
{
BOOL bResult = FALSE;
//打开服务控制管理器
SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (hSCM != NULL)
{
//打开服务
SC_HANDLE hService = ::OpenService(hSCM, mServiceName.c_str(), SERVICE_QUERY_CONFIG);
if (hService != NULL)
{
bResult = TRUE;
::CloseServiceHandle(hService);
}
::CloseServiceHandle(hSCM);
}
return bResult;
}
BOOL CService::StartService()
{
BOOL bRet;
SC_HANDLE hSCM;
SC_HANDLE hService;
hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT);
if (hSCM != NULL)
{
hService = OpenService( hSCM, mServiceName, SERVICE_START);
if (hService != NULL)
{
//开始Service
bRet = ::StartService(hService, 0, NULL);
::CloseServiceHandle(hService);
}
else
{
bRet = FALSE;
}
::CloseServiceHandle(hSCM);
}
else
{
bRet = FALSE;
}
return bRet;
}
BOOL CService::StopService()
{
BOOL bRet;
SC_HANDLE hSCM;
SC_HANDLE hService;
SERVICE_STATUS ServiceStatus;
hSCM = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );
if (hSCM != NULL)
{
hService = OpenService( hSCM, mServiceName, SERVICE_STOP | SERVICE_QUERY_STATUS );
if (hService != NULL)
{
QueryServiceStatus( hService, &ServiceStatus );
if (ServiceStatus.dwCurrentState == SERVICE_RUNNING)
{
bRet = ControlService( hService, SERVICE_CONTROL_STOP, &ServiceStatus );
}
else
{
bRet = FALSE;
}
CloseServiceHandle( hService );
}
else
{
bRet = FALSE;
}
CloseServiceHandle( hSCM );
}
else
{
bRet = FALSE;
}
return bRet;
}
void CService::Process()
{
//在这里添加服务的实际逻辑功能
LOG_MINDER(_T("服务已经停止!"));
}
void WINAPI CService::Service_Main()
{
// Register the control request handler
CService::mStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
CService::mStatus.dwCurrentState = SERVICE_STOPPED;
CService::mStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;
CService::mStatus.dwWin32ExitCode = 0;
CService::mStatus.dwServiceSpecificExitCode = 0;
CService::mStatus.dwCheckPoint = 0;
CService::mStatus.dwWaitHint = 0;
//注册服务控制
CService::mhStatus = RegisterServiceCtrlHandler(CService::mServiceName, CService::Service_Ctrl);
if (CService::mhStatus == NULL)
{
CService::Log(_T("服务控制注册失败!"));
return;
}
CService::mStatus.dwCurrentState = SERVICE_START_PENDING;
CService::mStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;
SetServiceStatus(CService::mhStatus, &CService::mStatus);
//如下代码可以为启动服务前的准备工作
CService::mhServiceEvent = ::CreateEvent( NULL, TRUE, FALSE, NULL );
if ( CService::mhServiceEvent == NULL )
{
CService::mStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus(CService::mhStatus, &CService::mStatus);
CService::Log(_T("启动服务失败,CreateEvent失败!"));
return;
}
//
//更改服务状态为启动
CService::mStatus.dwWin32ExitCode = S_OK;
CService::mStatus.dwCheckPoint = 0;
CService::mStatus.dwWaitHint = 0;
CService::mStatus.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus(CService::mhStatus, &CService::mStatus);
CService::Log(_T("启动服务成功!"));
CService::Process();
//等待用户选择停止服务,
//停止服务
CService::mStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus(CService::mhStatus, &CService::mStatus);
CService::Log(_T("启动已经停止!"));
}
void WINAPI CService::Service_Ctrl( DWORD _Ctrl )
{
switch (_Ctrl)
{
case SERVICE_CONTROL_STOP:
CService::mStatus.dwCurrentState = SERVICE_STOP_PENDING;
SetServiceStatus(CService::mhStatus, &CService::mStatus);
//告诉服务线程停止工作
::SetEvent( CService::mhServiceEvent );
break;
case SERVICE_CONTROL_PAUSE:
break;
case SERVICE_CONTROL_CONTINUE:
break;
case SERVICE_CONTROL_INTERROGATE:
break;
case SERVICE_CONTROL_SHUTDOWN:
break;
default:
break;
}
}
#include <Shlwapi.h>
void CService::Log( tstring _logText )
{
HANDLE hEventSource = RegisterEventSource(NULL, CService::mServiceName);
if (hEventSource != NULL)
{
LPCTSTR* p = new LPCTSTR;
*p = _logText.c_str();
ReportEvent(hEventSource, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0, p, NULL);
DeregisterEventSource(hEventSource);
delete p;
}
}
外部调用可以参考:
int _tmain(int argc, _TCHAR* argv[])
{
tstring moduleFileName = GetModulName();
moduleFileName = _T("\"") + moduleFileName + _T("\"");
tstring cmdLine = GetCommandLine();
cmdLine.trim();
tstring temp;
cmdLine.span_left(&temp, moduleFileName);
cmdLine = temp;
cout << "参数: " << t2a(cmdLine.c_str()) << endl;
cmdLine.lower();
SERVICE_TABLE_ENTRY st[] =
{
{ CService::mServiceName, (LPSERVICE_MAIN_FUNCTION)CService::Service_Main }, { NULL, NULL }
};
BOOL s = StartServiceCtrlDispatcher(st);
if(cmdLine.length() == 0)
{
cout << "参数列表:" << endl;
cout.setf(ios::left);
cout << setw(15) << "\t-install" << "\t安装EMinder服务" << endl
<< setw(15) << "\t-uninstall" << "\t卸载EMinder服务" << endl
<< setw(15) << "\t-start" << "\t启动EMinder服务" << endl
<< setw(15) << "\t-stop" << "\t停止EMinder服务" << endl
<< setw(15) << "\t-info" << "\t查看EMinder状态" << endl;
}
else if(cmdLine.find(_T("-install")) != -1)
{
CService::UninstallService();
BOOL ret = CService::InstallService();
if(ret)
{
cout << "服务安装成功!";
}
else
{
cout << "服务安装失败 : " << t2a(GetErrorMessage(GetLastError())) << endl;
}
}
else if(cmdLine.find(_T("-uninstall")) != -1)
{
BOOL ret = CService::UninstallService();
if(ret)
{
cout << "服务卸载成功!";
}
else
{
cout << "服务卸载失败 : " << t2a(GetErrorMessage(GetLastError())) << endl;
}
}
else if(cmdLine.find(_T("-start")) != -1)
{
BOOL ret = CService::StartService();
if(ret)
{
cout << "服务启动成功!";
}
else
{
cout << "服务启动失败 : " << t2a(GetErrorMessage(GetLastError())) << endl;
}
}
else if(cmdLine.find(_T("-stop")) != -1)
{
BOOL ret = CService::StopService();
if(ret)
{
cout << "服务停止成功!";
}
else
{
cout << "服务停止失败 : " << t2a(GetErrorMessage(GetLastError())) << endl;
}
}
return 0;
}