Ver Mensaje Individual
  #3  
Antiguo 13-06-2007
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Reputación: 20
cHackAll Va por buen camino
Cool Ok

Lastimosamente esta un poco complicado utilizando la API WinExec, La forma de hacerlo es listar los procesos y comprobar cuando el que creaste es terminado. El gran problema de esto (y no digo que se pueda hacer), es que puede existir un proceso con el mismo nombre que haya sido creado con anterioridad, en ese entonces que sucedera? cómo sabras cual creaste tu? obviamente se puede! pero no me parece la forma correcta.

Te dejo un par de APIs que te serán más util:

Código Delphi [-]
var
 si: TStartupInfo = (cb: SizeOf(TStartupInfo));
 pi: TProcessInformation;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
 CreateProcess(nil, 'c:\windows\system32\notepad.exe', nil, nil, False, 0, nil, nil, si, pi);
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
 if WaitForSingleObject(pi.hProcess, 0) = WAIT_OBJECT_0 then
  MessageBox(0, 'La aplicacion ha terminado, corre la siguiente!', nil, 0)
 else
  MessageBox(0, 'Todavia, espera!', nil, 0)
end;

0j0 que solo es para prueba, si no conoces la API te la explico: CreateProcess es la API que internamente utiliza el WinExec y otros. te permite un control un poco mas "avanzado" del nuevo proceso creado.

Yo pongo la estructura TStartupInfo como global pues la puedo inicializar en tiempo de diseño, si fuese local tendria que llamar a FillChar(0..., y luego a si.cb := SizeOf...
La estructura TProcessInformation es global pues debo poder saber el momento en que el nuevo proceso es liberado.

Finalmente el Button1 "corre" al Block de notas y el Button2 verifica si la aplicacion aún está en ejecucion con la API WaitForSingleObject utilizada para la sincronizacion (Mutex, Pipes, etc, etc).

Espero te sirva. Suerte!
Responder Con Cita