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