Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Aus Konsolenanwendung Programm starten und Ergebnis auslesen (https://www.delphipraxis.net/60699-aus-konsolenanwendung-programm-starten-und-ergebnis-auslesen.html)

VizeTE 11. Jan 2006 09:25


Aus Konsolenanwendung Programm starten und Ergebnis auslesen
 
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:

Delphi-Quellcode:
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!

turboPASCAL 11. Jan 2006 09:38

Re: Aus Konsolenanwendung Programm starten und Ergebnis ausl
 
Suche mal nach Hier im Forum suchenCreatePipe, ein Beispiel findest Du zB. hier: http://www.delphipraxis.net/internal...=344790#344790

Mit CreatePipe kann die Konsolenausgabe umgeleitet werden.

chaosben 11. Jan 2006 11:20

Re: Aus Konsolenanwendung Programm starten und Ergebnis ausl
 
Und um den Umgang mit Pipes angenehm zu gestalten gibts hier die Komponente "NPipe".

DerDan 11. Jan 2006 11:57

Re: Aus Konsolenanwendung Programm starten und Ergebnis ausl
 
Von mir ganz gerne genommen:

TJvCreateProcess aus der Jedi Lib


Auch könnt ich mir vorstellen, das du nicht den Umweg über eine Konsole gehen musst, falls svn ein API zur verfügung stellt. Ich kenne svn zwr nicht, aber andere Versionsverwaltungssystem die ich kenne haben eine API



mfg

DerDan


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:36 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz