Streams [Résolu]

Signaler
Messages postés
49
Date d'inscription
mardi 22 novembre 2005
Statut
Membre
Dernière intervention
10 novembre 2007
-
Messages postés
49
Date d'inscription
mardi 22 novembre 2005
Statut
Membre
Dernière intervention
10 novembre 2007
-
Salut tout le monde, je ne savais pas ou poster cette question :

J'ai une application console, à partir de cette application je lance une autre console grâce à Process, je voudrais rediriger les flux de cette console vers mon application telle que :
-L'entrée de ma console soit redirigée vers celle de l'autre console
-La sortie de l'autre console soit redirigée vers ma console

Est-ce que vous pourriez m'aider? Merci d'avance.

6 réponses

Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
38
Peut être cette fonction, je l'avais déja testée mais je me souviens plus de ce que ça donne :

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/attachconsole.asp
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
38
Salut, tu as une partie de la solution dans ce snippet :

http://www.codyx.org/snippet_recuperer-text-programme-console_72.aspx
Messages postés
49
Date d'inscription
mardi 22 novembre 2005
Statut
Membre
Dernière intervention
10 novembre 2007

Ok, c'est une solution possible, mais je souhaiterais savoir si il est possible de rediriger le flux plûtot que de le lire et de renvoyer le résultat sur ma console, pour pouvoir communiquer directement avec le processus externe en lui envoyant des commandes et en recevant ses résultats sur ma console??
Messages postés
49
Date d'inscription
mardi 22 novembre 2005
Statut
Membre
Dernière intervention
10 novembre 2007

De plus la methode ReadToEnd() est bloquante et mon programme reste bloqué jusqu'à ce que le flux de l'autre console soit plein, en gros, je voulais savoir si il existe un moyen de lire le flux de l'autre console jusqu'à ce qu'il n'y à plus rienà lire.
Messages postés
49
Date d'inscription
mardi 22 novembre 2005
Statut
Membre
Dernière intervention
10 novembre 2007

Wouah bien vu ^^
Cependant pour que cette fonction marche, j'ai du faire appel à FreeConsole(), mais malgré la réussite, il n'y a pas de difference :s
voici mon code :

class Class1
    {   
        [DllImport("kernel32.dll", EntryPoint="AttachConsole")]
            private static extern bool AttachConsole(int pId);
        [DllImport("kernel32.dll", EntryPoint="FreeConsole")]
            private static extern bool FreeConsole();

        /// <summary>
        /// Point d'entrée principal de l'application.
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {   
            Process p = new Process();
            p.StartInfo.FileName = "AppliTest.exe";
            //p.StartInfo.UseShellExecute = false;
            //p.StartInfo.RedirectStandardInput = true;
            //p.StartInfo.RedirectStandardOutput = true;
            p.Start();
            FreeConsole();
            if(AttachConsole(p.Id))
                Console.WriteLine("Attachement réussi!");
            else
                Console.WriteLine("Echec attachement");
           
            string mes ="";
            while(mes!="exit")
            {
                mes=Console.ReadLine();
                Console.WriteLine(mes);
            }
            p.Close();
        }
    }

Lorsque je tappe un mot, il s'écrit bien dans ma console, cependant j'attendais de voir le résultat de la sortie de l'autre console...
Je vais faire d'autre testes, merci pour cette api je n'y avais pas pensé .
Messages postés
49
Date d'inscription
mardi 22 novembre 2005
Statut
Membre
Dernière intervention
10 novembre 2007

C'est bon j'ai réussi!!!
J'ai redirigé l'entrée de ma console vers la console externe mais ne pas rediriger la sortie et sa fonctionne!!
Voici le code final pour d'autres qui chercheraient la solution :
class EmulateurTerminal
    {   
        [DllImport("kernel32.dll", EntryPoint="AttachConsole")]
            private static extern bool AttachConsole(int pId);
        [DllImport("kernel32.dll", EntryPoint="FreeConsole")]
            private static extern bool FreeConsole();

        /// <summary>
        /// Point d'entrée principal de l'application.
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {   
            Process p = new Process();
            p.StartInfo.FileName = "AppliTest.exe";
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.RedirectStandardInput = true;       // On redirige l'entrée de la console externe
            //p.StartInfo.RedirectStandardOutput = true;  // On ne redirige pas la sortie (automatique)
            p.Start();
            FreeConsole();                                                 // On libère cette console
            if(AttachConsole(p.Id))                                     // On s'attache à la console externe
                Console.WriteLine("Attachement réussi!");
            else
                Console.WriteLine("Echec attachement");

           
            string mes ="";
            while(!p.HasExited)
            {
                mes=Console.ReadLine();
                p.StandardInput.WriteLine(mes);   // On écrit sur l'entrée de la console externe et recoit le résultat
            }
            p.Close();
        }

Merci Lutinore