Espero no tener que vigilar las escrituras directas en VGA, porque para lo que necesito capturar la salida..., sería un auténtico engorro tener que andarme con esas cosas...
Ya sabía lo del > y el >>
. Es lo más básico de lo más mínima programación elemental
. Pero preferiría no tener que recurrir a ese truco.
De todos modos, muchas gracias a todos.
La captura de la salida a MS-DOS que necesito hacer, es sólo una pequeña parte de un problema mayor que debo resolver. Si consigo perfeccionar el resto de los puntos de mi problema, quizá no necesite ser "tan exigente" con la captura. Y en este caso, la solución presente en TrucoManía, y la presentada por kurono, cualquiera de las dos podría valerme.
No obstante. Debo reseñar una cosa al respecto de sendas soluciones. Ambas tienen un bucle, dentro del cual se va capturando la salida a MS-DOS mientras que el proceso sigue activo...
En ocasiones, dependiendo de qué se quiera ejecutar, nunca se detecta el fin de la actividad del proceso. En esos casos el bucle se convierte en infinito.
Por lo tanto, aconsejo a quien vaya a utilizar esos trucos, que incorpore en dicho bucle un Time-Out, el que cada cual estime más oportuno...
Por ejemplo..., éste es el bucle al que hago referencia en la solución aportada por kurono:
Código Delphi
[-]
[...]
begin
[...]
repeat
PeekNamedPipe(read_stdout, @Buffer, SizeOf(Buffer) - 1, @bread, @avail, nil);
if bread > 0 then
begin
Fillchar(Buffer, SizeOf(Buffer), 0);
ReadFile(read_stdout, Buffer, bread, bread, nil);
Result:= Result + String(PChar(@Buffer));
end;
Application.ProcessMessages;
GetExitCodeProcess(pi.hProcess, exitcod);
until (exitcod <> STILL_ACTIVE) and (bread = 0);
[...]
end;
Conviene declarar una variable TDateTime para controlar el tiempo transcurrido. Primero la inicializamos reflejando en ella el TimeOut a respetar, y luego añadimos el control del TimeOut dentro de la condición de salida del bucle.
Código Delphi
[-]
var
TimeOut : TDateTime; [...]
begin
[...]
TimeOut := Now + EncodeTime(0,0,30,0);
repeat
PeekNamedPipe(read_stdout, @Buffer, SizeOf(Buffer) - 1, @bread, @avail, nil);
if bread > 0 then
begin
Fillchar(Buffer, SizeOf(Buffer), 0);
ReadFile(read_stdout, Buffer, bread, bread, nil);
Result:= Result + String(PChar(@Buffer));
end;
Application.ProcessMessages;
GetExitCodeProcess(pi.hProcess, exitcod);
until ((exitcod <> STILL_ACTIVE) and (bread = 0))
or (timeout < now); [...]
end;