Red de conocimiento informático - Conocimiento del nombre de dominio - Cómo implementar el reinicio automático del programa MFC

Cómo implementar el reinicio automático del programa MFC

void ReStart(BOOL bNormal)

{

información PROCESS_INFORMATION;

inicio STARTUPINFO;

char szPath[128];

char * szCmdLine;

GetModuleFileName(AfxGetApp()-gt; m_hInstance, szPath, sizeof(szPath));

szCmdLine = GetCommandLine();

GetStartupInfo(& inicio);

BOOL bSucc = CreateProcess(szPath, szCmdLine, NULL, NULL,

FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, inicio, amp;info) ;

if(bNormal amp; amp; bSucc)

{

CWnd *pWnd = AfxGetMainWnd()

if(pWnd; != NULL)

{

pWnd-gt; PostMessage(WM_CLOSE, 0, 0,

}

else

ProcesoSalida(-1);

}

más

ProcesoSalida(-1);

}

VC implementa el reinicio del programa

En muchos casos, necesitamos volver a ejecutar el programa actualmente en ejecución, y debemos volver a ejecutar el programa inmediatamente después de cerrarlo para formar; Un nuevo proceso;

Código de muestra:

1. Agregar código en el evento del botón de reinicio:

g_bIsRunAgain=true //Controlar si se vuelven a ejecutar las variables<; /p>

this-gt;SendMessage(WM_CLOSE);

Agregar ON_WM_CLOSE en el fármaco MESSAGE_MAP

2. Agregar código de procesamiento de mensajes OnClose():

p>

if(g_bIsRunAgain)

{

char pBuf[MAX_PATH] // Variable para guardar la ruta

GetCurrentDirectory(MAX_PATH, pBuf); // Obtener el directorio actual del programa

strcat(pBuf, "\");

strcat(pBuf, AfxGetApp()-gt; m_pszExeName

strcat(pBuf, ".exe");

CString strPath = (CString) pBuf

STARTUPINFO StartInfo

PROCESS_INFORMATION procStruct;

memset(amp;StartInfo, 0, tamaño de(STARTUPINFO));

StartInfo.cb = tamaño de

(STARTUPINFO);

::CreateProcess(

(LPCTSTR) strPath,

NULL,

NULL,

NULO,

NULO,

p> FALSO,

NORMAL_PRIORITY_CLASS,

NULO,

NULO ,

NULL,

& StartInfo,

& procStruct

}

CDialog. ();

La función de reiniciar el programa del cuadro de diálogo se realiza consultando información. El proceso es el siguiente:

1ShowWindow(SW_HIDE); p>

2WinExec(strPath, SW_SHOW);//Inicie el archivo ejecutable en la ruta strPath

3 OnOK();//Salga de la implementación actual del programa del cuadro de diálogo

Además, al obtener strPath, también debe usar la función: GetModuleFileName(NULL, buf, sizeof(buf)) para obtener la ruta del archivo de ejecución del programa actual.

Código fuente adjunto:

1void CF_RockClientDlg::OnBtnRestart()

2{

3 // TODO: Añade tu notificación de control código del controlador aquí

4 char buf[256];

5::GetModuleFileName(NULL, buf, sizeof(buf));

6 CString strPath = buf;

7 ShowWindow(SW_HIDE); //Ocultar este cuadro de diálogo

8 WinExec(SW_HIDE);

4 // TODO: agregue su controlador de notificaciones de control código aquí

5 // TODO: Agregue el código del controlador de notificación de control al cuadro de diálogo.

8 WinExec(strPath, SW_SHOW); //Inicie el archivo ejecutable en la ruta strPath

9 OnOK(); // Salga del programa de diálogo ejecutable actual

10}

vc implementa el reinicio del software

Generalmente, lo desea para generar un reinicio automático del software en el caso.

Por ejemplo, tengo un subdiálogo en un proyecto de diálogo que después de hacer clic en el botón "Aceptar" aparece una ventana emergente que me pregunta si debo reiniciar el software.

En este cuadro de diálogo secundario,

if(OK)

if(MessageBox("La configuración cambió, es necesario reiniciar el software para que surta efecto", " Notice", MB_YESNO)==IDYES)

{

// El mensaje WM_ONSETRESTART es un mensaje personalizado

//Para implementar el cambio de una variable booleana, utilizar Para evaluar si la respuesta al mensaje wm_close fue activada por el botón (de lo contrario, el software se reiniciará para siempre)

AfxGetMainWnd()-gt.SendMessage(WM_ONSETRESTART)(WM_ONSETRESTART)(WM_ONSETRESTART)(WM_ONSETRESTART)( WM_ONSETRESTART)(WM_ONSETRESTART )(WM_ONSETRESTART)(WM_ONSETRESTART)SendMessage(WM_ONSETRESTART);

AfxGetMainWnd()-gt.SendMessage(WM_CLOSE);

}

En el cuadro de diálogo principal en OnClose:

void CTransFileDlg::OnClose()

{

char pBuf[MAX_PATH];

/

GetModuleFileName(NULL, pBuf, MAX_PATH);

STARTUPINFO startupinfo;

PROCESS_INFORMATION proc_info.INFORMATION proc_info;

memset(amp; información de inicio, 0, tamaño de(STARTUPINFO));

información de inicio. cb=sizeof(STARTUPINFO);

//El lugar más importante

if(m_bSetRestart)

::CreateProcess(pBuf, NULL, NULL, NULL, FALSO,

NORMAL_PRIORITY_CLASS, NULL, NULL, & startupinfo, & proc_info

CDialog::OnClose()

}

;