Domanda

Sto cercando di reindirizzare l'output di una dll nativa di terze parti che esegue l'output su stdout / stderr da C #. L'output di entrambi stdout e stderr dovrebbe andare in un file di registro.

Ecco la mia idea (x2 per due stream):

  • Crea un AnonymousPipeServerStream
  • Ottieni l'handle del pipe tramite _outServer.SafePipeHandle.DangerousGetHandle()
  • Usa P / Invoca per chiamare SetStdHandle con detta maniglia
  • Crea un AnonymousPipeClientStream collegato a il flusso del server
  • Crea un thread per sederti in un ciclo leggendo dal AnonymousPipeClientStream e inviando al logger.
  • Chiama periodicamente flush su AnonymousPipeServerStream

Quindi tutto questo sembra funzionare bene ... nel mio codice. Non appena il controllo passa alla DLL nativa, tutto torna a stderr! Se necessario, posso eseguire il debug nella DLL nativa e vedere cosa non va, ma ... Preferirei davvero di no, quindi qualcuno ha qualche idea prima di passare 10 ore a cercare di capire come funzionano gli handle?

Per riferimento, il codice del test è disponibile all'indirizzo: http://pastebin.com/f3eda7c8 . Le cose interessanti sono le righe 58-89 nel costruttore. (Aggiungerò la gestione degli errori, ecc. Più avanti, ovviamente).

È stato utile?

Soluzione

L'ho risolto, anche se la soluzione (ovviamente) ha ben poco a che fare con il problema. La dll è stata compilata in mingw, che apparentemente non rispetta gli handle utilizzati dal runtime di MSVC.

Lascio il codice & amp; soluzione nel caso in cui altri incontrino questo problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top