基本信息
文件名称:C++程序自动重启的实现代码.docx
文件大小:20.47 KB
总页数:11 页
更新时间:2025-05-17
总字数:约7.34千字
文档摘要

C++程序自动重启的实现代码

目录一、自动重启的原理二、自动重启的实现三、相关知识点3.1CommandLineToArg3.2LocalFree3.3OpenProcess3.4WaitForSingleObject3.5GetExitCodeProcess3.6GetModuleFileName3.7GetStartupInfo3.8CreateProcess拓展

一、自动重启的原理

我不知道为什么很多程序员觉得自动重启很low,就像我始终不明白为什么有些人一听见我说重新编译一下就笑,难道不是重新编译一下大部分问题就解决了吗?

自动重启原理很简单,用一个进程监控另一个进程,挂了就再启动一个。细节也不算多,主要是正确判断进程状态和启动方式,其实最大的工作量是程序恢复时应该如何回到原来的状态,这意味着程序要随时保存状态。

只要你能做到用户无感,你在背后做了什么用户在意吗?

二、自动重启的实现

如果是UNIX,用fork然后监控子进程,挂了就再fork,一个循环就解决问题了。

windows上麻烦一些,监控进程,控制台程序:

#includestdafx.h

#includeshellapi.h

#includestdio.h

#includestring

usingnamespacestd;

boolbDebug=false;

intAPIENTRYwWinMain(_In_HINSTANCEhInstance,

_In_opt_HINSTANCEhPrevInstance,

_In_LPWSTRlpCmdLine,

_In_intnCmdShow)

UNREFERENCED_PARAMETER(hPrevInstance);

//TODO:在此处放置代码。

if(bDebug)MessageBox(NULL,lpCmdLine,TEXT(启动),0);

wchar_tbuf[256];

DWORDpid=0;

LPWSTR*szArglist;

intnArgs;

inti;

//从命令行获取要监控的进程的PID,参数-pid后的下一个参数

szArglist=CommandLineToArgvW(lpCmdLine,nArgs);//注意,如果没有参数,会返回程序名,如果有参数,则不包括程序名(或许是个BUG)

if(NULL==szArglist)

MessageBox(NULL,lpCmdLine,TEXT(CommandLineToArgvW失败),0);

return0;

else

wsprintf(buf,TEXT(参数个数%d),nArgs);

if(bDebug)MessageBox(NULL,buf,TEXT(),0);

for(i=0;inArgs;++i)

if(bDebug)MessageBox(NULL,szArglist[i],TEXT(CommandLineToArgvW),0);

if(0==_tcsicmp(szArglist[i],TEXT(-pid))i+1nArgs)

pid=_wtol(szArglist[i+1]);

wsprintf(buf,TEXT(%u),pid);

if(bDebug)MessageBox(NULL,buf,szArglist[i+1],0);

LocalFree(szArglist);

wsprintf(buf,TEXT(%u),pid);

if(bDebug)MessageBox(NULL,buf,TEXT(pid),0);

//打开进程以供监控

HANDLEhandle=OpenProcess(PROCESS_QUERY_INFORMATION|SYNCHRONIZE,FALSE,pid);

//等待进程结束

DWORDstate=WaitForSingleObject(handle,INFINITE);

if(WAIT_OBJECT_0==state)

DWORDexitCode;

if(!GetExitCodeProcess(handle,exitCode))//获得退出码

MessageBox(NULL,TEXT(GetExitCodeProcess出错),TEXT(