Hier ist es für die Ausgabepipe, für die Fehlerpipe machst du das gleiche:
Delphi-Quellcode:
Stream := TMemoryStream.Create;
try
while true do begin
succeed := ReadFile(PipeOutputRead, Buffer, 255, NumberOfBytesRead, nil);
if not succeed then
break;
Stream.Write(Buffer, NumberOfBytesRead);
end;
Stream.Position := 0; //Diese Zeile
Output.LoadFromStream(Stream); //und diese Zeile
finally
Stream.Free;
end;
CloseHandle(PipeOutputRead);
Der Code liest alle Daten heraus, und sobald die Eingabe abgebrochen wird, wir alles der Stringlist hinzugefügt. Wir ändern die Reihenfolge ein wenig: die beiden Zeilen, die mit einem Kommentar versehen sind, werden in die Schleife geschoben, das heißt der Code müsste so aussehen:
Delphi-Quellcode:
Stream := TMemoryStream.Create;
try
while true do begin
succeed := ReadFile(PipeOutputRead, Buffer, 255, NumberOfBytesRead, nil);
if not succeed then
break;
Stream.Write(Buffer, NumberOfBytesRead);
Stream.Position := 0; //Diese Zeile
Output.LoadFromStream(Stream); //und diese Zeile
end;
finally
Stream.Free;
end;
CloseHandle(PipeOutputRead);
Dadurch werden die Daten vom Stream immer in die StringList geladen, und nicht erst sobald das cmd-Programm fertig ist. Der Algo ist sicher noch optimierungsfähig (nicht immer alles laden sondern nur zusätzliche Daten), aber es ist ein Ansatz.