Entwickler-Ecke

Sonstiges (.NET) - Redirect stdout of com-objects


danielf - Do 03.07.14 08:31
Titel: Redirect stdout of com-objects
Hallo,

ich würde gerne die Standard-Konsolenausgabe von meinen DLLs parsen. Hierfür habe ich den Console Out in StringWriter umgeleitet, den ich dann auslese.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
StringWriter writer = new StringWriter();
Console.SetOut(writer);

// call COM object
Server.Process(parameter)

string output = new StringReader(writer.ToString()).ReadToEnd();

Leider ist es so, dass das COM-Object aus zwei Teilen besteht. Eine native registry free com und eine managed registry free com. Die Ausgaben der managed com Klassen werden in den writer umgeleitet. Die std::cout Aufrufe der native com Klassen werden aber weiterhin auf der Konsole ausgegeben.

Wie komme ich and die Standard Ausgabe des native Com-Objects?

Danke und Gruß
Daniel


Th69 - Do 03.07.14 09:30

Hallo Daniel,

evtl. hilft dir Redirect STDERR output from COM object wrapper in .NET [http://stackoverflow.com/questions/4925189/redirect-stderr-output-from-com-object-wrapper-in-net]?

Die wichtige Zeile daraus ist:

C#-Quelltext
1:
status = SetStdHandle(STDOUT_HANDLE, handle);                    


danielf - Do 03.07.14 10:11

Hallo Th69,

auf den Post bin ich auch gestoßen. Problem ist das es nur mit File-Handles funktioniert (irgendwann stoßt man auch auf AsynchronousNamedPipes, mit denen man ein Handle auf einen managed Stream bekommt). Deshalb habe ich es zuerst nicht ausprobiert. Ich habe es nun testweise ausprobiert und in dem File landen genau die Ausgaben von der managed componente und die nativen auf der Konsole. Also kein Unterschied zu Console.SetOut(stream); :(

Ich versuche auch einen Stream an eine Methode des Com-Objects zu übergeben um dort dann den StdOut umzuleiten. Allerdings scheitere ich daran welches Objekt ich in der IDL als Parameter übergebe... Ach C++ COM Interop suxx ;o

Gruß
Daniel