Lanzar y controlar una aplicación exterior
Artículo por Club Developers · 31 diciembre 2005
3606 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.
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:
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:
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
procedure TForm1.Button2Click(Sender: TObject); Var StartInfo: TStartupInfo; ProcessInfo: TProcessInformation; Fin: Boolean; begin { Inicializar la estructura StartInfo } FillChar(StartInfo, SizeOf(StartInfo), #0); { sólo tenemos el tamaño, las otras opciones serán inicializadas por defecto } StartInfo.cb := SizeOf(StartInfo); { Lanzamos la linea de comendos } If CreateProcess(Nil, '"Notepad.exe"', Nil, Nil, False, 0, Nil, Nil, StartInfo, ProcessInfo) Then Begin { Si la aplicación se ha lanzado sin problemas, esperamos a su fin } { ProcessInfo.hProcess contiene el handle del proceso principal de la aplicación } Fin := False; Repeat { esperamos a que terine la aplicación } Case WaitForSingleObject(ProcessInfo.hProcess, 200) of WAIT_OBJECT_0 : Fin := True; { la aplicación ha termnado, salimos } WAIT_TIMEOUT :;  { aun no ha terminado, seguimos esperando } End; { refrescamos la ventana para que no parezca que se ha bloqueado } Application.ProcessMessages; Until Fin; { hemos terminado } ShowMessage('Proceso terminado'); End Else RaiseLastOSError; 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
CreateProcess(Nil,'"Notepad.exe" "c:\temp\prueva.txt"' , 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
CreateProcess(Nil, '"C:\MesProg\MiApp.exe"' , Nil, Nil, False, 0, Nil, Nil, StartInfo, ProcessInfo);