C++制作软件重启助手

         不知道大家在编程时有没有遇到过需要重启你编写的软件的情况,比如涉及到数据库还原的时候。如何实现一个软件不需要用户干涉而自动重启呢?除了用多线程以外我的想法是制作一个重启助手,需要重启的程序调用这个重启助手并传递程序路径给重启助手(如:reboot.exe –c c://a.exe),然后程序关闭。重启助手做的就是获取参数,检查路径然后启动参数里的程序。

我的想法是先建一个MFC控制台程序,在_tmain函数添加实现代码:

CString flag=argv[1];//获取参数1

CString spath=argv[2];//获取参数2,即路径参数

if(flag.IsEmpty()){//参数为空

MessageBox(NULL,"请不要直接运行此程序!","提示",MB_OK|MB_ICONEXCLAMATION);

}

else if(flag=="-c"){

if (PathFileExists(spath)||PathFileExists(spath+".exe")){//文件存在

                  ShellExecute(NULL,"open", spath,NULL,NULL,SW_SHOWNORMAL);//发送打开路径文件命令

}

else{

         AfxMessageBox("找不到程序"+spath+",启动失败!");

         ShellExecute(NULL,"open", spath,NULL,NULL,SW_SHOWNORMAL);

}                          

}

ExitProcess(-1);

这样重启助手就完成了。

使用只要在需要重启的代码里添加个重启的静态函数再调用即可,C++如下代码:

static void RebootApp(CWnd *cWnd){

         CString path;

         GetModuleFileName(NULL,path.GetBufferSetLength(MAX_PATH+1),MAX_PATH);

         path.ReleaseBuffer();

         int pos = path.ReverseFind('\\');

         path = path.Left(pos);//取得当前程序目录

         CString spath= path + "\\RebootHelper.exe";//设置重启助手路径     

         CString strBufCur="\\"+CConvert::ToString(AfxGetApp()->m_pszAppName);//取得当前程序名称

         if (PathFileExists(spath)){//重启助手是否存在

                            ShellExecute(cWnd->m_hWnd,"open", spath,"-c "+ path +strBufCur,NULL,SW_HIDE);//发送带参数打开重启助手命令

                   }

                   else{//不存在

                            MessageBox(cWnd->m_hWnd,"缺少文件自动重启失败,请手动启动!","错误提示",MB_OK|MB_ICONEXCLAMATION);

                   }

                   ExitProcess(-1);

         }

这样做的优点是通用性强,不仅C++可以用其实平台开发出来的软件也可以调用,有新的项目复制到项目目录即可使用,无需重新开发。

posted @ 2013-05-21 16:48  弼码温  阅读(435)  评论(0编辑  收藏  举报