win7和winservice2003下的守护进程服务,备忘

本文记录了一个老数据转发软件的守护进程实现,选择以Windows服务形式运行,以应对进程挂掉时自动重启。在Windows 7及以后版本中,由于Session 0隔离,服务无法直接启动用户进程,需使用CreateProcessAsUserW。而在Windows Server 2003和XP中,需处理CreateProcessAsUserW不支持的问题,通过版本判断来适配不同系统的启动方式。
摘要由CSDN通过智能技术生成

有一个几年前的老的数据转发软件,偶尔会自动挂掉,由于历史太久远,不愿意再去做代码修改。就想到开放另外一个守护进程,对转发软件进行检查,发现进程列表中没有该进程就自动重启数据转发程序。而且考虑到可能会有其他相似的需求,考虑做成一个通用的程序,方便再次遇到时候使用。

开始时候一直纠结是做成windows service还是普通的单实例进程,最终选择用windows service

1、创建一个win32控制台程序,添加main.cpp

main.cpp:


#define CONFIGPATH "config\\config.json"
CProcessGroup* pProcessServer; 
void ServiceMain(int argc, char** argv); 
void ControlHandler(DWORD request); 
int InitService();

//获取当前目录下的配置文件
Json::Value GetConfig(std::string strPath = "")
{
	char szCurrentDir[MAX_PATH + 1] = {0};
	char szFileName[MAX_PATH] = {0};
	GetModuleFileNameA(NULL, szCurrentDir, MAX_PATH);


	sprintf(szFileName,"%s",&(strrchr(szCurrentDir, '\\'))[1]);
	(strrchr(szFileName, '.'))[0] = 0;


	(strrchr(szCurrentDir, '\\'))[1] = 0;

	Json::Reader jrReader;
	Json::Value jvProCnfg;
	std::ifstream is;

	is.open(std::string(szCurrentDir)+CONFIGPATH, std::ios::binary);
	
	if(!jrReader.parse(is, jvProCnfg))
	{

		return jvProCnfg;
	}

	std::string capstr = strfunc::StrW2A(strfunc::StrA2W(jvProCnfg.toFastString(),CP_UTF8));
	if(!jrReader.parse(capstr, jvProCnfg))
	{
		ProcessGroupLog().WriteError(L"%s,参数打开配置文件%s失败",
			strfunc::StrA2W(__FUNCTION__).c_str(),
			strfunc::StrA2W(capstr).c_str());
		return jvProCnfg;
	}


	ProcessGroupLog().WriteInfo(L"%s,打开配置完成 参数:%s",
			strfunc::StrA2W(__FUNCTION__).c_str(),
			strfunc::StrA2W(jvProCnfg.toFastString()).c_str());


	return jvProCnfg;
}

//入口
int _tmain(int argc, _TCHAR* argv[])
{


	SERVICE_TABLE_ENTRY ServiceTable[2];
	ServiceTable[0].lpServiceName = L"ProcessProtectService";
	ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;

	ServiceTable[1].lpServiceName = NULL;
	ServiceTable[1].lpServiceProc = NULL;


	StartServiceCtrlDispatcher(ServiceTable); 


	return 0;
}

//服务执行函数
void ServiceMain(int argc, char** argv) 
{ 
	int error; 

	ServiceStatus.dwServiceType = 
	SERVICE_WIN32; 
	ServiceStatus.dwCurrentState = 
	SERVICE_START_PENDING; 
	ServiceStatus.dwControlsAccepted = 
	SERVICE_ACCEPT_STOP | 
	SERVICE_ACCEPT_SHUTDOWN;
	ServiceStatus.dwWin32ExitCode = 0; 
	ServiceStatus.dwServiceSpecificExitCode = 0; 
	ServiceStatus.dwCheckPoint = 0; 
	ServiceStatus.dwWaitHint = 0; 


	
	hStatus = RegisterServiceCtrlHandler(
	L"ProcessProtectService", 
	(LPHANDLER_FUNCTION)ControlHandler); 
	if (hStatus == (SERVICE_STATUS_HANDLE)0) 
	{ 
		// Registering Control Handler failed
		return; 
	} 
	// Initialize Service 
	error = InitService(); 
	if (!error) 
	{
		// Initialization failed
		ServiceStatus.dwCurrentState = 
		SERVICE_STOPPED; 
		ServiceStatus.dwWin32ExitCode = -1; 
		SetServiceStatus(hStatus, &ServiceStatus); 
		return; 
	} 
	// We report the running status to SCM. 
	ServiceStatus.dwCurren
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值