Das Aufrufen klappt schon mal und die Parameterübergabe. Das aufgerufene Programm ist ein Kommandozeilenprogramm, das eine PDF Datei aufnimmt und in eine Textdatei umwandelt. Kann ich diesen Output direkt abfangen und wenn möglich das speichern auf der Festplatte verhindern ?
Mit dem Code aus dem Tutorial klappt es jedenfallt nicht (Einlesen eines großen Outputs (auf wiki.freepascal)), die Ausgabe bleibt lehr. Keine Fehlermeldung. Oder wird hier nur die Ausgabe von Programmmeldungen abgefagt ?
Code: Alles auswählen
procedure TForm1.Button2Click(Sender: TObject);
// Copyright (c) 2004 by Marc Weustink
const
READ_BYTES = 2048;
var
S: TStringList;
M: TMemoryStream;
P: TProcess;
n: LongInt;
BytesRead: LongInt;
begin
M := TMemoryStream.Create;
BytesRead := 0;
P := TProcess.Create(nil);
P.Executable := 'pdfintxt.exe';
P.Parameters.Add('Datei.pdf');
P.Options := [poUsePipes, poNoConsole];
Memo1.Lines.Add('-- executing --');
P.Execute;
while P.Running do
begin
// stellt sicher, dass wir Platz haben
M.SetSize(BytesRead + READ_BYTES);
// versuche, es zu lesen
n := P.Output.Read((M.Memory + BytesRead)^, READ_BYTES);
if n > 0
then begin
Inc(BytesRead, n);
Write('.')
end
else begin
// keine Daten, warte 100 ms
Sleep(100);
end;
end;
// lese den letzten Teil
repeat
// stellt sicher, dass wir Platz haben
M.SetSize(BytesRead + READ_BYTES);
// versuche es zu lesen
n := P.Output.Read((M.Memory + BytesRead)^, READ_BYTES);
if n > 0
then begin
Inc(BytesRead, n);
Write('.');
end;
until n <= 0;
if BytesRead > 0 then WriteLn;
M.SetSize(BytesRead);
Memo1.Lines.Add('-- executed --');
S := TStringList.Create;
S.LoadFromStream(M);
Memo1.Lines.Add('-- linecount = ' + IntToStr(S.Count)+' --');
for n := 0 to S.Count - 1 do
begin
Memo1.Lines.Add('| '+ S[n]);
end;
Memo1.Lines.Add('-- end --');
S.Free;
P.Free;
M.Free;
end;