Obtener el código de salida de la aplicación

3334 vistas

Tendremos que usar la función GetExitCodeProcess del API Win32.
Esta función necesita un handle sobre el proceso del que queremos el código de salida, como el obtenido por CreateProcess o OpenProcess por ejemplo.

Atención: hace falta el handle del proceso, no el de la ventana principal.

Ejemplo con CreateProcess:



delphi
  1. function RunAndGetExitCode ( Const CommandLine: String ): LongWord ;
  2. var
  3.   StartupInfo: TStartupInfo;
  4.   ProcessInfo: TProcessInformation;
  5. begin
  6.   FillChar(StartupInfo,SizeOf(StartupInfo),#0);
  7.   StartupInfo.cb := SizeOf(StartupInfo);
  8.   if not CreateProcess( Nil, PChar(CommandLine), Nil, Nil, True, 0, Nil, Nil, StartupInfo, ProcessInfo) then
  9.     RaiseLastOSError;
  10.   // esperamos a que termine el proceso.
  11.   WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
  12.   // recuperamos el código de salida.
  13.   GetExitCodeProcess(ProcessInfo.hProcess, Result);
  14. end;



Ejemplo con OpenProcess:



delphi
  1. function GetExitCode ( Const PID: LongWord ): LongWord ;
  2. var
  3.   hApp: THandle;
  4.   ExitCode: LongWord;
  5. begin
  6.   hApp := OpenProcess(PROCESS_QUERY_INFORMATION, False, PID);
  7.   // recuperamos código de salida.
  8.   GetExitCodeProcess(hApp, Result);
  9. end;



Nota: si el proceso está siempre activo, su código de salida es STILL_ACTIVE. Ejemplo de aplicación devolviendo un código de error:



delphi
  1. program StopWithExitCode ;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. begin
  6.   // Esta instrucción termina el programa enviando un código de salida.
  7.   // Por convenio, el 0 se usa para indicar que no se han producido errores.
  8.   Halt(3);
  9. end.