Lanzar y controlar una aplicación exterior

3361 vistas

Para ejecutar una aplicación y recuperar el handle del proceso, es necesario la utilización de la función del API CreateProcess. Esta función permite ejecutar una linea de comandos con un gran nombre de opciones (que no describiremos aquà pero que podéis ver en el MSDN de Microsoft). Esta función devolverá el handle del proceso y el hilo principal de la aplicación ejecutada. Esta particulariedad la utilizaremos para guardar un control sobre la aplicación lanzada.

La linea de comandos pasada a CreateProcess no puede contener espacios en el nombre de fichero o bien, será necesario entrecomillarlos (ejemplo: "nombre con espacio"). Por lo tanto, es recomendable que por defecto se use el entrecomillado para evitarnos problemas.



delphi
  1. procedure TForm1.Button2Click(Sender: TObject);
  2. Var 
  3.   StartInfo: TStartupInfo;
  4.   ProcessInfo: TProcessInformation;
  5.   Fin: Boolean;
  6. begin
  7.   { Inicializar la estructura StartInfo }
  8.   FillChar(StartInfo, SizeOf(StartInfo), #0);
  9.   { sólo tenemos el tamaño, las otras opciones serán inicializadas por defecto }
  10.   StartInfo.cb := SizeOf(StartInfo);
  11.  
  12.   { Lanzamos la linea de comendos }
  13.   If CreateProcess(Nil, '"Notepad.exe"', Nil, Nil, False,
  14.                 0, Nil, Nil, StartInfo, ProcessInfo) Then
  15.   Begin
  16.     { Si la aplicación se ha lanzado sin problemas, esperamos a su fin }
  17.     { ProcessInfo.hProcess contiene el handle del proceso principal de la aplicación }
  18.     Fin := False;
  19.     Repeat
  20.       { esperamos a que terine la aplicación }
  21.       Case WaitForSingleObject(ProcessInfo.hProcess, 200) of
  22.         WAIT_OBJECT_0 : Fin := True; { la aplicación ha termnado, salimos }
  23.         WAIT_TIMEOUT  :;           Â  { aun no ha terminado, seguimos esperando }
  24.       End;
  25.       { refrescamos la ventana para que no parezca que se ha bloqueado }
  26.       Application.ProcessMessages;
  27.     Until Fin;
  28.     { hemos terminado }
  29.     ShowMessage('Proceso terminado');
  30.   End
  31.   Else RaiseLastOSError;
  32. End;



En el ejemplo sólo esperamos a que termine la aplicación, pero el handle devuelto en ProcessInfo.hProcess puede ser usado para cualquier función API de procesos.

Para ejecutar una aplicación con parámetros tendremos que añadirlos en la linea de comandos:



delphi
  1. CreateProcess(Nil,'"Notepad.exe" "c:\temp\prueva.txt"'
  2.       , Nil, Nil, False, 0, Nil, Nil, StartInfo, ProcessInfo);



CreateProcess busca el ejecutable en la carpeta en curso y despues por las carpetas que se encuentren en el Path de Windows, pero es posible especificar la ruta de la carpeta:



delphi
  1. CreateProcess(Nil, '"C:\MesProg\MiApp.exe"'
  2.       , Nil, Nil, False, 0, Nil, Nil, StartInfo, ProcessInfo);