怎样让程序重新启动自己

来源:互联网 发布:多玩魔盒for mac 编辑:程序博客网 时间:2024/04/19 03:26
void   ReStart(BOOL   bNormal)

{
 PROCESS_INFORMATION   info;
 STARTUPINFO startup;
 char szPath[128];
 char *szCmdLine;

 GetModuleFileName(AfxGetApp()-> m_hInstance,   szPath,   sizeof(szPath));
 szCmdLine   =   GetCommandLine();
 GetStartupInfo(&startup);

 BOOL   bSucc   =   CreateProcess(szPath,   szCmdLine,   NULL,   NULL,
  FALSE,   NORMAL_PRIORITY_CLASS,   NULL,   NULL,   &startup,   &info);

 if(bNormal   &&   bSucc)
 {
  CWnd *pWnd   =   AfxGetMainWnd();

  if(pWnd   !=   NULL)
  {
   pWnd-> PostMessage(WM_CLOSE,   0,   0);
  }
  else
   ExitProcess(-1);
 }
 else
  ExitProcess(-1);
}

 

VC实现程序重新启动
在很多情况下,我们需要将当前运行的程序重新运行;此时我们就必须在程序关闭后立即重新运行程序,形成新的进程;
实例代码:
1、重启按钮事件中添加代码:


    g_bIsRunAgain=true;//控制是否重新运行的变量
    this->SendMessage(WM_CLOSE);

   在MESSAGE_MAP中药添加 ON_WM_CLOSE


2、在OnClose()消息处理中加入代码:


     if(g_bIsRunAgain)
     {
        char pBuf[MAX_PATH];                                  //存放路径的变量
        GetCurrentDirectory(MAX_PATH,pBuf);                   //获取程序的当前目录
        strcat(pBuf,"\");
        strcat(pBuf,AfxGetApp()->m_pszExeName);
        strcat(pBuf,".exe");       
        CString strPath= (CString) pBuf;      
        STARTUPINFO StartInfo;
        PROCESS_INFORMATION procStruct;
        memset(&StartInfo, 0, sizeof(STARTUPINFO));
        StartInfo.cb = sizeof(STARTUPINFO);
        ::CreateProcess(
            (LPCTSTR) strPath,
            NULL,
            NULL,
            NULL,
            FALSE,
            NORMAL_PRIORITY_CLASS,
            NULL,
            NULL,
            &StartInfo,
            &procStruct);
     }
     CDialog::OnClose();

 

通过查阅资料实现了对话框程序重新启动的功能,流程如下:

1ShowWindow(SW_HIDE);//隐藏本对话框
2WinExec(strPath, SW_SHOW);//启动strPath路径下的执行文件
3 OnOK();//退出当前执行对话框程序

另外在获取strPath是使用函数:GetModuleFileName(NULL,buf,sizeof(buf))获取当前程序的执行文件路径。

附源代码:

 1void CF_RockClientDlg::OnBtnRestart() 
 2{
 3    // TODO: Add your control notification handler code here
 4    char buf[256];
 5    ::GetModuleFileName(NULL,buf,sizeof(buf));
 6    CString strPath = buf;
 7    ShowWindow(SW_HIDE);//隐藏本对话框
 8    WinExec(strPath, SW_SHOW);//启动strPath路径下的执行文件
 9    OnOK();//退出当前执行对话框程序
10}

 

vc 实现软件重启

一般要在一个事件里产生软件的自动重启 。

比如,我在一个对话框工程的子对话框中有一个单击按钮“确定”后弹出一个是否重开软件的功能。

子对话框中:

if(MessageBox("更改了设置,需重启软件生效","Notice",MB_YESNO)==IDYES)
{
   // WM_ONSETRESTART 消息是一个自定义的消息

//实现一个布尔变量的开关,以此评估 响应 wm_close 消息是不是由这个按钮触发(否则软件永远重启)
   AfxGetMainWnd()->SendMessage(WM_ONSETRESTART);
   AfxGetMainWnd()->SendMessage(WM_CLOSE);
}

在主对话框中的 OnClose 中:

void CTransFileDlg::OnClose()
{
   char pBuf[MAX_PATH];

//获取应用程序完全路径,比 GetCurrentDirectory 好用多了
GetModuleFileName(NULL,pBuf,MAX_PATH);

STARTUPINFO startupinfo;
PROCESS_INFORMATION proc_info;

memset(&startupinfo,0,sizeof(STARTUPINFO));
startupinfo.cb=sizeof(STARTUPINFO);

// 最重要的地方
if(m_bSetRestart)
   ::CreateProcess(pBuf,NULL,NULL,NULL,FALSE,
   NORMAL_PRIORITY_CLASS,NULL,NULL,&startupinfo,&proc_info);

   CDialog::OnClose();
}

原创粉丝点击