作者:朱金灿
来源:http://blog.csdn.net/clever101
在《VC实现程序重启的做法》一文中我介绍了如何重启一个GUI程序的做法,今天研究了一下如何重启一个控制台程序,发现其实也很简单,简而言之就是新建一个进程,然后杀死当前进程。下面是一个测试程序:
#include "stdafx.h"
#include <windows.h>
#include <string>
using std::string;
using std::wstring;
#include "boost/algorithm/string.hpp"
#include "boost/filesystem/path.hpp"
#include "boost/filesystem/operations.hpp"
#include "boost/format.hpp"
int main(int argc, char* argv[])
{
TCHAR szAppName[MAX_PATH];
:: GetModuleFileName(NULL, szAppName, MAX_PATH);
std::wstring strAppFullName = szAppName;
// 假如不存在文件就创建文件并写入文件,假如存在文件就读取文件
std::wstring strLog = strAppFullName.substr(0,strAppFullName.rfind('\\')+1);
strLog += std::wstring(_T("log.txt"));
FILE * fp = NULL;
// 这里用到了boost库的文件系统接口
if(!boost::filesystem::exists(strLog))
{
if( (fp = _tfopen(strLog.c_str(),_T("w"))) != NULL )
puts ("create log file successful!");
}
else
{
if( (fp = _tfopen(strLog.c_str(),_T("r"))) != NULL )
puts("open log file successful!");
}
// 新建一个进程
STARTUPINFO StartInfo;
PROCESS_INFORMATION procStruct;
memset(&StartInfo, 0, sizeof(STARTUPINFO));
StartInfo.cb = sizeof(STARTUPINFO);
::CreateProcess(
strAppFullName.c_str(),
NULL,
NULL,
NULL,
FALSE,
NORMAL_PRIORITY_CLASS,
NULL,
NULL,
&StartInfo,
&procStruct);
// 关闭当前进程
HWND hWnd = ::FindWindow(NULL,szAppName);
ULONG nProcessID;
::GetWindowThreadProcessId( hWnd, &nProcessID );
HANDLE hProcessHandle = ::OpenProcess( PROCESS_TERMINATE, FALSE,nProcessID );
::TerminateProcess( hProcessHandle, 4 );
return 0;
}