Frage

Ich versuche, die Ausgabe eines Dritt nativen DLL, die / stderr nach stdout ausgibt zu umleiten aus C #. Der Ausgang beider stdout und stderr in eine Protokolldatei gehen sollte.

Hier ist meine Idee (x2 für zwei Ströme):

  • Erstellen Sie eine AnonymousPipeServerStream
  • Holen Sie den Griff des Rohres über _outServer.SafePipeHandle.DangerousGetHandle()
  • Verwenden Sie P / Invoke aufrufen SetStdHandle mit dem Griff
  • Erstellen Sie eine AnonymousPipeClientStream verbunden der Server Strom
  • Erstellen Sie einen Thread in einer Schleife von der AnonymousPipeClientStream Lesen sitzen und an den Logger ausgegeben werden.
  • In regelmäßigen Abständen flush auf der AnonymousPipeServerStream rufen

So alles gut zu funktionieren scheint ... In meinem Code. Sobald die Steuerung an die nativen DLL geht, geht alles auf stderr zurück! Wenn es sein muss, kann ich in die native DLL debuggen und sehen, was falsch läuft, aber ... Ich würde wirklich lieber nicht, so hat jemand irgendwelche Ideen, bevor ich 10 Stunden verbringen, um herauszufinden, wie die Arbeit behandelt?

Als Referenz ist der Testcode an: http://pastebin.com/f3eda7c8 . Die interessanten Sachen sind Zeilen 58-89 im Konstruktor. (Ich werde die Fehlerbehandlung, etc. hinzufügen später, natürlich).

War es hilfreich?

Lösung

ich es gelöst, obwohl die Lösung (natürlich) hat sehr wenig mit dem Problem zu tun. Die DLL wurde in mingw zusammengestellt, die offenbar nicht die Griffe von der MSVC Laufzeit verwendet nicht einhält.

Ich werde den Code verlassen & Lösung dieses Problem bei allen anderen Begegnungen auf.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top