C-Sharp - Umleiten des StandardOutput eines Process geht nicht
Hallo Zusammen.
Ich bin gerade am verzweifeln.
Ich habe hier ein Fremdprogramm samt seiner V-C++-Projektdateien.
Das Programm schaltet in Windows die Standart-Sound-Ausgabe auf das Gerät mit der entsprechenden, als Parameter übergebenen Nummer um.
Der Aufruf "run.exe 1" schaltet zum Beispiel auf HDMI um, "run.exe 2" auf Headset, etc.
Der Aufruf "run.exe", also ohne Parameter, erzeugt eine Liste, die alle aktiven Audio-Ausgabe-Geräte, von 0 an durchnummeriert, enthält.
Genau diese Liste möchte ich nun in die Variable DevicesList umleiten.
Beispiel für den Aufruf ohne Parameter
Auf das Fremdprogramm (run.exe) greife ich aus meinem C#-Projekt mit System.Diagostics.Process zu und leite den StandardOutput in die String DevicesList um.
Im C++-Programm wird die Ausgabe mit printf erstellt, also auf die Standard-Ausgabe geschrieben, wenn ich das Programm mit CMD ausführe, erhalte ich auch eine Ausgabe.
In meinem Programm erhalte ich jedoch keine Ausgabe zurück.
Ich habe den Programmaufruf und die Umleitung auch schon mit einer test.bat-Datei des Inhalts
echo Hallo Welt
run.exe
echo ciao
getestet, das Ergebnis war dann, dass in der Variable nach >run.exe nichts mehr stand, echo ciao wurde also gar nicht ausgeführt.
In CMD funktionierte aber alles korrekt.
Habe sicherheitshalber auch mal den StandardError umgeleitet, aber auch ohne Ergebnis
Die Standard-Ausgabe fange ich mit folgendem Code-Fragment:
Bei einem C++-Testprogramm, dass nur mit printf einmal "test" schreibt, konnte ich mit dieser Methode die Ausgabe umleiten.
Auch mit einer .bat-Datei ging es.
Das Umschalten auf andere Geräte geht mit dieser Methode auch. Der Pfad stimmt also.
Bitte um schnelle Hilfe, ich verzweifel hier.
Falls ihr noch weiteren Code braucht, sagt es mir.
LG 94erBrom
Ich bin gerade am verzweifeln.
Ich habe hier ein Fremdprogramm samt seiner V-C++-Projektdateien.
Das Programm schaltet in Windows die Standart-Sound-Ausgabe auf das Gerät mit der entsprechenden, als Parameter übergebenen Nummer um.
Der Aufruf "run.exe 1" schaltet zum Beispiel auf HDMI um, "run.exe 2" auf Headset, etc.
Der Aufruf "run.exe", also ohne Parameter, erzeugt eine Liste, die alle aktiven Audio-Ausgabe-Geräte, von 0 an durchnummeriert, enthält.
Genau diese Liste möchte ich nun in die Variable DevicesList umleiten.
Beispiel für den Aufruf ohne Parameter
C:\AudioDeviceSwitcher>run.exe
Audio Device 0: Lautsprecher (6- Logitech G430 Gaming Headset)
Audio Device 1: Audials Sound Capturing (Audials Sound Capturing)
Audio Device 2: Lautsprecher (Realtek High Definition Audio)
Audio Device 3: GRUNDIG WXGA-4 (2- NVIDIA High Definition Audio)
Auf das Fremdprogramm (run.exe) greife ich aus meinem C#-Projekt mit System.Diagostics.Process zu und leite den StandardOutput in die String DevicesList um.
Im C++-Programm wird die Ausgabe mit printf erstellt, also auf die Standard-Ausgabe geschrieben, wenn ich das Programm mit CMD ausführe, erhalte ich auch eine Ausgabe.
In meinem Programm erhalte ich jedoch keine Ausgabe zurück.
Ich habe den Programmaufruf und die Umleitung auch schon mit einer test.bat-Datei des Inhalts
echo Hallo Welt
run.exe
echo ciao
getestet, das Ergebnis war dann, dass in der Variable nach >run.exe nichts mehr stand, echo ciao wurde also gar nicht ausgeführt.
In CMD funktionierte aber alles korrekt.
Habe sicherheitshalber auch mal den StandardError umgeleitet, aber auch ohne Ergebnis
Die Standard-Ausgabe fange ich mit folgendem Code-Fragment:
public static void getDevicesList()
{
Process p = new Process();
p.StartInfo.FileName = exelocation;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.UseShellExecute = false;
p.StartInfo.Arguments = "";
Console.WriteLine(Environment.NewLine + exelocation + Environment.NewLine); //dient nur der Sicherstellung, dass der Pfad stimmt
try
{
p.Start();
StreamReader reader = p.StandardOutput;
devicesList = reader.ReadToEnd();
p.WaitForExit();
}
catch (Exception ex)
{
Console.WriteLine(Environment.NewLine + Environment.NewLine + ex + Environment.NewLine + Environment.NewLine);
MessageBox.Show("Exception!!!", null);
}
MessageBox.Show("Inhalt von DevicesList:" + Environment.NewLine + devicesList, "DevicesList");
}
Bei einem C++-Testprogramm, dass nur mit printf einmal "test" schreibt, konnte ich mit dieser Methode die Ausgabe umleiten.
Auch mit einer .bat-Datei ging es.
Das Umschalten auf andere Geräte geht mit dieser Methode auch. Der Pfad stimmt also.
Bitte um schnelle Hilfe, ich verzweifel hier.
Falls ihr noch weiteren Code braucht, sagt es mir.
LG 94erBrom
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 258362
Url: https://administrator.de/contentid/258362
Ausgedruckt am: 26.11.2024 um 11:11 Uhr
5 Kommentare
Neuester Kommentar
Moin,
versuch mal den Output deines c++ Programms stattdessen mit
ausgeben zu lassen. Das sollte in jedem c++ funktionieren.
Gruß jodel32
versuch mal den Output deines c++ Programms stattdessen mit
std::cout << "Hello World" << std::endl;
Gruß jodel32
Wenn du den C++ Quellcode hast warum setzt du dir das Prog nicht direkt in c# um, ohne den Umweg des Auslesens vom Standardout ??
Kompilierst du das Programm selber oder nimmst du immer nur ein bereits fertig kompiliertes Programm ? Ich schätze mal das Prog wurde nicht mit den richtigen Compiler-Schaltern kompiliert.
Meine Glaskugel hat leider schon Schicht und hängt am Christbaum, so dass ich hier leider keinen Quellcode aus ihr herzaubern kann
Kompilierst du das Programm selber oder nimmst du immer nur ein bereits fertig kompiliertes Programm ? Ich schätze mal das Prog wurde nicht mit den richtigen Compiler-Schaltern kompiliert.
Meine Glaskugel hat leider schon Schicht und hängt am Christbaum, so dass ich hier leider keinen Quellcode aus ihr herzaubern kann