Hallo,
ich möchte mit meiner Konsolenanwendung eine andere Konsolenanwendung starten und dann das Ergebnis einlesen. Bei der Delphi-Hilfe habe ich mir abgeguckt wie ich in der Konsole einen einfachen Text eingebe und den dann auslese:
Delphi-Quellcode:
procedure Test;
var
AString: string;
begin
Write('Enter a line of text: ');
ReadLn(AString);
WriteLn('You typed: ', AString);
WriteLn('Hit <Enter> to exit');
ReadLn;
end;
Niko hat mir in einem anderen
Thread bereits gezeigt wie ich die Standardausgabe einlesen kann wenn meine Konsolenanwendung von einem anderen Prozess gestartet wird. Das Funktioniert auch prima.
Jetzt soll mein Konsolenprogramm aber selbst einen anderen Prozess starten und anschließend dessen Ergebnis auslesen.
Ich habe versucht das mit ShellExecuteEx hinzubekommen, leider mit wenig Erfolg.
Zum Hintergrund: Ich verwende Subversion und möchte mit meiner Konsolenanwendung Subversion nach einer Eigenschaft meiner Head-Revision fragen. Wenn ich das in der Kommandozeile eingebe sieht der Befehl wie folgt aus:
svn propget svn:log c:\projekte\test\repositorytest --revprop -r 6
Als Antwort bekomme ich eine neue Zeile in der Konsole mit dem Wert der angeforderten Eigenschaft und genau diese möchte ich gern einlesen und weiterverarbeiten.
Mein bisheriger Code sieht so aus:
Delphi-Quellcode:
procedure TestRun;
var
ALine:
string;
begin
if RunExecutableAndWait('
svn', '
propget svn:log c:\projekte\test\repositorytest --revprop -r 6')
then
ReadLn(ALine)
else
ALine := SysErrorMessage(GetLastError);
WriteLn('
Result: ', ALine);
WriteLn('
Hit <Enter> to exit');
ReadLn;
end;
function RunExecutableAndWait(AExecutable, AParams:
string): boolean;
var
AProcessHandle : dword;
AShellExecInfo : TShellExecuteInfo;
begin
Result := false;
FillChar(AShellExecInfo, SizeOf(AShellExecInfo), 0);
with AShellExecInfo
do
begin
cbSize := SizeOf(AShellExecInfo);
fMask := SEE_MASK_NOCLOSEPROCESS
or SEE_MASK_FLAG_DDEWAIT;
lpVerb := '
open';
lpFile := PChar(AExecutable);
lpParameters := PChar(AParams);
end;
if ShellExecuteEx(@AShellExecInfo)
then
AProcessHandle := AShellExecInfo.HProcess
else
Exit;
while WaitForSingleObject(AProcessHandle, 50) <> WAIT_OBJECT_0
do
Sleep(100);
CloseHandle(AProcessHandle);
Result := true;
end;
Funktioniert aber leider nicht.
Schon mal vielen Dank im Voraus!