Einzelnen Beitrag anzeigen

VizeTE

Registriert seit: 31. Dez 2002
178 Beiträge
 
Delphi 5 Enterprise
 
#1

Aus Konsolenanwendung Programm starten und Ergebnis auslesen

  Alt 11. Jan 2006, 10:25
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!
  Mit Zitat antworten Zitat