Einlesen der Ausgaben eines externen Programms in ein eigenes Programm



  • Wie bekannt kann man mit folgendem Code die Ausgaben eines externen Programms in ein eigenes C++-Programm einlesen:

    Process ^p=gcnew Process;
    p->StartInfo->FileName="c:\\Temp\\batch2.bat";
    p->StartInfo->Arguments="Bernie";
    p->StartInfo->UseShellExecute=false;
    p->StartInfo->RedirectStandardOutput=true;
    p->Start();
    String^ Ausgabe=p->StandardOutput->ReadLine();
    p->WaitForExit();
    p->Close();

    Wenn das externe Programm nur eine Zeile auswirft, ist das super.

    Leider weiß ich nicht, wie das geht, wenn das externe Programm mehrere Zeilen auswirft und ich die mit meinem selbstgestrickten Programm erfassen und in Stringvariablen packen möchte. Wie muss man String^ Ausgabe=p->StandardOutput->Readline() umstricken?

    Vielen Dank für Eure Hilfe im voraus.



  • ReadLine liest eben nur genau eine Zeile. Wenn du also mehrere Zeilen lesen willst, dann benötigst du eben eine Schleife...

    Alternativ gibt es auch noch ReadToEnd() (einfach mal ein bißchen bei den Eigenschaften und Methoden der StreamReader-Klasse stöbern -)



  • Th69 schrieb:

    ReadLine liest eben nur genau eine Zeile. Wenn du also mehrere Zeilen lesen willst, dann benötigst du eben eine Schleife...

    Alternativ gibt es auch noch ReadToEnd() (einfach mal ein bißchen bei den Eigenschaften und Methoden der StreamReader-Klasse stöbern -)

    Ich sehe das genauso wie Du. Darum habe ich das mit ReadToEnd() probiert, hat aber nichts genützt. Aus merkwürdigen Gründen kriege ich immer nur eine Zeile zurück, was mich etwas ratlos macht...



  • Wenn du den gesamten Output des externen Programms lesen willst, dann solltest du erst auf das Ende warten und danach lesen:

    p->WaitForExit(); 
    String^ Ausgabe = p->StandardOutput->ReadToEnd();
    

    Möchtest du jedoch schon die Daten lesen während das andere Programm noch läuft, so müßtest du asynchron lesen, d.h. mittels des Process.OutputDataReceived-Ereignisses, s.a. http://www.mycsharp.de/wbb2/thread.php?threadid=56592 (ist zwar in C#, spielt bei .NET ja aber keine Rolle -)



  • Vielen Dank, Th69, das war's! 🙂

    Jetzt weiß ich endlich, wie ich aus meinem C++/CLI-Programm ein Programm, das auf der Konsole läuft, mit Kommandozeilenargumenten aufrufen und Rückgabewerte des Programms in meine WindowsForm unter C++/CLI einlesen kann. Funktioniert bei mir mit .bat- und .exe-Programmen unter MSWindows. Super! Merci bien!


Log in to reply