创建windows服务

是用一个类封装静态函数实现的.

头文件:


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;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值