2010-01-19 45 views
11

Ho avuto difficoltà a ottenere l'output di un "processo secondario" (uno avviato internamente da un processo blackbox che sto monitorando tramite C# System. Diagnostics.Process)C#: reindirizzare l'output standard di un processo già in esecuzione

Ho preso il consiglio dato dalla risposta del mio post precedente: here. E lì puoi trovare i dettagli di quello che ho passato.

A questo punto, anche se sono in grado di individuare il processo ssh generato da process1.exe, che sto monitorando. Non riesco a reindirizzare l'output al mio programma C#, perché è un "processo già in esecuzione" e non è stato avviato direttamente da C#.

Sembra che tutte le proprietà impostate su un oggetto System.Diagnostics.Process abbiano effetto solo se si avvia esplicitamente tale processo dall'applicazione C#; se qualche altro "processo non gestito" ha avviato il processo, l'impostazione di questo reindirizzamento non ha alcun effetto, poiché il processo è già stato avviato da qualcosa che non ha specificato il reindirizzamento di cui ho bisogno.

Esiste un modo per reindirizzare l'output di un processo che è già stato avviato (un processo avviato da un programma per il quale non è possibile precedere il reindirizzamento prima dell'avvio di questo processo)?

risposta

1

Invece di reindirizzare l'output direttamente dal processo in esecuzione, è possibile acquisire l'output mentre lascia il processo A alla destinazione prevista, passarlo nel nuovo processo?

+0

Com'è possibile? Sto già reindirizzando tutto l'output da process1.exe alla mia applicazione C#. Nel momento in cui process1 lancia internamente ssh.exe (process2), ricevo 3 ulteriori righe di output da process1, quindi l'output cessa, poiché process2 è l'unica cosa che emette (sospetto) e non posso reindirizzare process2 output, perché viene avviato internamente da process1 (per il quale non posso controllare il reindirizzamento). –

2

Supponendo che non ci sia una soluzione più semplice, è possibile provare a eseguire un pezzo un codice in un altro processo tramite CreateRemoteThread(), spiegato here.

1

Forse si può guardare questo code. L'ho trovato mentre cercavo una soluzione per fare lo stesso genere di cose; tuttavia, non era realmente inter-processo.

Se ciò non aiuta, si potrebbe essere in grado di guardare P/Invocazione SetStdHandle e GetStdHandle che dovrebbero essere utilizzati per il reindirizzamento dell'output standard. Penso che questo sia l'esempio di codice collegato a fare il reindirizzamento.

Nota: Ho appena visto questa roba e in realtà non ha funzionato correttamente. (Avevo a disposizione una soluzione migliore perché avevo accesso al codice sorgente in uscita alla console)

+0

Anche se non completamente testato (o funziona davvero AFAIR): http://pastebin.com/m13ab7101 Questo è quello che avevo sviluppato in base al materiale di 'SetStdHandle'. HTH! – cmw

Problemi correlati