Hola:
Me gustaría saber si existe la manera de reiniciar una aplicación desde dentro de la misma. Hay situaciones como un cambio de idioma, coger datos de configuración,... que hacen necesario reiniciar la aplicación, y me gustaría saber como se hace.
Saludos,
reiniciar una aplicación
- José Luis Sánchez
- Posts: 484
- Joined: Thu Oct 13, 2005 9:23 am
- Location: Novelda - Alicante - España
- Contact:
Es una forma poco ortodoxa pero me funciona
Es una forma poco ortodoxa pero me funciona,
donde quieras que se reinicie tu aplicación,
1º llamas a un exe que va a volver a llamar a tu aplicación
2º te sales de la aplicación
Espero te sirva,
Saludos
.... tu codigo de tu aplicacion ...
Ejecuta("LlamaNuevoExe.EXE )
ErrorLevel(3)
PostQuitMessage(0)
__Quit()
.... fin
--- LlamaNuevoExe.EXE ---
// LLamaNuevoExe.prg sólo tiene una función y es llamar a tu aplicación.
function LlamaNuevoExe()
Ejecuta("TuAplicación.EXE")
Return nil
-- Function Ejecuta --
*******************************
* Ejecutar Programas Externos *
*******************************
FUNCTION Ejecuta(cEjecuta, lSeparate)
LOCAL hInstance
DEFAULT lSeparate TO .F.
IF IsWinNT()
IF lSeparate
hInstance := WinExec("cmd.exe /c start /SEPARATE "+cEjecuta ,0)
ELSE
hInstance := WinExec("cmd.exe /c start "+cEjecuta ,0)
ENDIF
ELSE
hInstance := WinExec("Start "+cEjecuta ,0)
ENDIF
RETURN hInstance
donde quieras que se reinicie tu aplicación,
1º llamas a un exe que va a volver a llamar a tu aplicación
2º te sales de la aplicación
Espero te sirva,
Saludos
.... tu codigo de tu aplicacion ...
Ejecuta("LlamaNuevoExe.EXE )
ErrorLevel(3)
PostQuitMessage(0)
__Quit()
.... fin
--- LlamaNuevoExe.EXE ---
// LLamaNuevoExe.prg sólo tiene una función y es llamar a tu aplicación.
function LlamaNuevoExe()
Ejecuta("TuAplicación.EXE")
Return nil
-- Function Ejecuta --
*******************************
* Ejecutar Programas Externos *
*******************************
FUNCTION Ejecuta(cEjecuta, lSeparate)
LOCAL hInstance
DEFAULT lSeparate TO .F.
IF IsWinNT()
IF lSeparate
hInstance := WinExec("cmd.exe /c start /SEPARATE "+cEjecuta ,0)
ELSE
hInstance := WinExec("cmd.exe /c start "+cEjecuta ,0)
ENDIF
ELSE
hInstance := WinExec("Start "+cEjecuta ,0)
ENDIF
RETURN hInstance
Dpto.Desarrollos eTi
Jesús Díez González
Villajoyosa (Alicante)
Jesús Díez González
Villajoyosa (Alicante)
- José Luis Sánchez
- Posts: 484
- Joined: Thu Oct 13, 2005 9:23 am
- Location: Novelda - Alicante - España
- Contact:
re:
Gracias Jesús. Lo que quiero hacer es que el mismo exe se llame a si mismo. Lo que me propones está bien, pero no es lo que quiero hacer.
Saludos,
Saludos,
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Jose Luis,
Con WinExec() podrías volver a ejecutar el EXE, luego darle foco a la nueva aplicación y finalmente terminar la primera.
De un modo esquemático sería asi:
WinExec( <aplicacion> )
SetFocus( <ventana_principal_aplicacion_nueva_instancia> )
<ventana_principal>:End()
Asi terminaría la actual, y la nueva quedaría activa.
Con WinExec() podrías volver a ejecutar el EXE, luego darle foco a la nueva aplicación y finalmente terminar la primera.
De un modo esquemático sería asi:
WinExec( <aplicacion> )
SetFocus( <ventana_principal_aplicacion_nueva_instancia> )
<ventana_principal>:End()
Asi terminaría la actual, y la nueva quedaría activa.
- José Luis Sánchez
- Posts: 484
- Joined: Thu Oct 13, 2005 9:23 am
- Location: Novelda - Alicante - España
- Contact:
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Puedes usar FindWindow() para encontrar el handle de la ventana.
Posiblemente habría que esperar un poco desde que arrancas la aplicación con WinExec() hasta que la ventana se crea y está visible.
Habría que revisar las opciones de WinExec() ó usar alguna función que aguarde un cierto tiempo (Sleep(), bucle con SysRefresh(), etc.)
Posiblemente habría que esperar un poco desde que arrancas la aplicación con WinExec() hasta que la ventana se crea y está visible.
Habría que revisar las opciones de WinExec() ó usar alguna función que aguarde un cierto tiempo (Sleep(), bucle con SysRefresh(), etc.)