MFC-实现软件程序的重启

来源:互联网 发布:php小程序 编辑:程序博客网 时间:2024/05/21 09:21

转载地址: 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);
    }

}

当单击此按钮时,程序重启。如下图:

MFC-实现软件程序的重启 - 漠雨 - 沙漠里de烟雨

 

方法二:

如果方法一不奏效(一般应用程序如果在启用时要加载一些配置文件的话,或是需要一个完全新的启动环境时),可以使用通过在程序结束前

启动一批处理程序,然后发送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"后立马退出命令行窗口,不阻塞。


0 0