Tengo una pregunta con suerte rápida: ¿Es posible retrasar un poco la ejecución de ShellExecute?¿Esperar antes de llevar a cabo ShellExecute?
Tengo una aplicación con autoupdater. Después de que descarga todos los archivos necesarios, cambia el nombre de los archivos actuales a * .OLD y el nuevo como el anterior. Suficientemente simple. Pero luego necesito eliminar esos archivos .OLD. Este procedimiento de "limpieza" se ejecuta en MainForm.OnActivate (con una marca de verificación si es el primero que activa el proceso). Pero esto aparentemente sucede demasiado rápido (obtengo False de DeleteFile). Este es el procedimiento:
procedure TUpdateForm.OKBtnClick(Sender: TObject);
const SHELL = 'ping 127.0.0.1 -n 2';
begin
ShellExecute(0,'open',pchar(SHELL+#13+Application.ExeName),nil,nil,SW_SHOWNORMAL);
Application.Terminate;
end;
Se supone que este procedimiento reinicia la aplicación. Estoy seguro de que el problema de eliminación está causado por el inicio rápido de la segunda aplicación, porque si lo reinicio yo mismo, otorgándole un poco de tiempo, los archivos se eliminan normalmente.
tl; dr versión: Necesito llamar a ShellExecute() que espera un poco (0.1 seg o menos) y LUEGO ejecuta el comando.
Nota
He intentado utilizar el comando -ping para tratar de retrasar, pero no funcionó.
Muchas gracias de antemano
Editar: reformulado
Necesito que esto suceda || La primera aplicación se cierra; Espere 100 ms; la segunda aplicación abre ||. Necesito llamar primero a ShellExecute, luego esperar hasta que la aplicación de llamada se cierre por completo y luego ejecutar el shell (es decir, abrir la segunda aplicación)
No lo entiendo.¿Quieres esperar 100 ms y luego hacer 'ShellExecute'? Bueno, entonces hazlo! 'Sueño (100); ShellExecute (...) '. ¿O desea que 'ShellExecute' * no regrese hasta que el proceso recién creado haya salido *? Si es así, en teoría, quiere el 'Sleep' *** después de ***' ShellExecute', no * before * it. Pero esa es una solución fea. En su lugar, debe 'WaitForSingleObject' o algo así. –
Trataré de reformularlo: necesito que esto suceda || La primera aplicación se cierra; Espere 100 ms; se abre la segunda aplicación ||. Necesito llamar primero a ShellExecute, luego esperar hasta que la aplicación de llamada se cierre por completo, luego ejecutar el shell (es decir, abrir la segunda aplicación) -> Ninguna de sus sugerencias. Necesito el ShellExecute _not para ejecutar_ hasta que la aplicación actual esté completamente cerrada (para poder eliminar sus archivos) –
No puede hacer eso. Después de que se ha cerrado la aplicación 1, pero antes de que se haya abierto la aplicación 2, no puede hacer nada porque no tiene un programa en ejecución. Lo que puede hacer es llamar a una aplicación, dormir y luego llamar a otra aplicación y luego finalizarla. Pero en lugar de un 'Sleep 'fijo, debe' WaitForSingleObject' u otra cosa más robusta. –