Autor Beitrag
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Do 03.07.14 09:31 
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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4799
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 03.07.14 10:30 
Hallo Daniel,

evtl. hilft dir Redirect STDERR output from COM object wrapper in .NET?

Die wichtige Zeile daraus ist:
ausblenden C#-Quelltext
1:
status = SetStdHandle(STDOUT_HANDLE, handle);					
danielf Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Do 03.07.14 11: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