转载地址: http://zhouzhenren163.blog.163.com/blog/static/6549928120124301202102/
如题:
方法一:通过守护进程
这里添加一个按钮,双击按钮转至程序,添加如下代码:
void CBackupDlg::OnBtnReset()
{
// TODO: Add your control notification handler code here
//得到当前程序的路径;
char strPath[100];
GetModuleFileName(NULL,strPath,100);
//创建守护进程,在启用新进程成功后发送WM_QUIT消息结束原来的进程;
STARTUPINFO startInfo;
PROCESS_INFORMATION processInfo;
ZeroMemory(&startInfo, sizeof(STARTUPINFO));
startInfo.cb = sizeof(STARTUPINFO);
if(CreateProcess(NULL,(LPTSTR)(LPCTSTR)strPath, NULL, NULL,FALSE, 0, NULL, NULL, &startInfo, &processInfo))
{
CloseHandle( processInfo.hProcess );
CloseHandle( processInfo.hThread );
PostQuitMessage(WM_CLOSE);
}
}
当单击此按钮时,程序重启。如下图:
方法二:
如果方法一不奏效(一般应用程序如果在启用时要加载一些配置文件的话,或是需要一个完全新的启动环境时),可以使用通过在程序结束前
启动一批处理程序,然后发送WM_QUIT消息给应用程序来释放资源而结束程序(这里设置等待一段时间再启动程序的用意是让CPU有足够的时间去释放应用程序的所有资源),方法其实很简单:
在应用程序的同一目录下新建一批处理文件,如:StartApp.bat ,里面的指令段如下:
@echo off
set /a num=5
:Cir
for /l %%i in (1,1,2000) do echo off
set /a num=%num%-1
if not %num%==0 goto Cir
cd /d %~dp0
start "" "Backup.exe"
exit
而应用程序的代码中就不用如方法一那样写一段很长的代码,只需要如下:
char cmd[20] = ".\\StartApp.bat";
system(cmd);
PostQuitMessage(WM_CLOSE);
即可。
[附注]
三种方法使用延迟:
1)
@echo off
@ping -n 5 127.1 >nul 2>nul
rem 其中5是ping 5次,这大概有5秒的延迟.
2)
@echo off
set /a num=5
:Cir
for /l %%i in (1,1,2000) do echo Waiting... >nul
set /a num=%num%-1
if not %num%==0 goto Cir
3)
@echo off
echo wscript.sleep 5000 > delay.vbs
在相同目录下新建一delay.vbs脚本文件供批处理调用,内容如下:
cscript //nologo delay.vbs & del delay.vbs
cd /d %~dp0 的意思是转至当前批处理所批的目录下;
start "" "Backup.exe" 此意思是启动程序Backup.exe 后不会阻塞等待此应用程序结束而是直接退出批处理;
这里,如果写成call "Backup.exe" 或 start "Backup.exe" 则会等待Backup.exe程序结束后,批处理窗口才会关闭,期间如果程序一直没有结束,批处理启动的命令行窗口则会一直打开着。而如果start "" "应用程序.exe" 则是启动"应用程序.exe"后立马退出命令行窗口,不阻塞。