2008-11-25 8 views
2

J'utilise le code suivantRedirect gros du processus enfant avec .net

System::Diagnostics::Process^ p = gcnew System::Diagnostics::Process(); 
p->StartInfo->FileName = "tnccmd.exe"; 
p->StartInfo->UseShellExecute = false; 
p->StartInfo->RedirectStandardInput = true; 
p->StartInfo->RedirectStandardOutput = true; 
p->Start(); 
System::IO::StreamWriter^ tnc_stdin = p->StandardInput; 
System::IO::StreamReader^ tnc_stdout = p->StandardOutput; 

tnc_stdin->WriteLine("connect i 127.0.0.1"); 
String^ prg_output = tnc_stdout->ReadToEnd(); 

Mon problème est que je ne peux pas lire stdout correctement. Je peux facilement écrire à stdin cependant, mais maintenant j'essaye d'implémenter un certain code de vérification d'erreur et cela ne fonctionne pas.

Le programme que j'utilise ne semble pas écrire en stdout même s'il est exécuté en ligne de commande. Je peux reproduire le bug avec ftp.exe qui vient avec Windows XP par défaut. Si vous modifiez le ->FileName avec ftp.exe l'invite de commande ftp.exe donne généralement ftp> n'apparaîtra pas dans prg_output.

Maintenant, je sais que l'invite doit utiliser une sorte de windows shell curses et je peux mélanger des problèmes.

Normalement juste après l'instruction connect i 127.0.0.1 je suis censé recevoir connecting to 127.0.0.1... mais je ne reçois rien.

Un indice sur ce que je fais mal? Y a-t-il un autre type de stdout que je ne connais pas?

EDIT

Je ne peux pas utiliser des arguments parce que j'ai plusieurs lignes à écrire, un peu comme avec ftp.exe. En outre, ftp.exe est généré lorsque vous tapez des commandes telles que dir. Au moins, il sort lorsque vous écrivez des commandes inconnues, il se plaint de Invalid command.

Répondre

0

Je suppose que vous essayez d'envoyer à stdin ce qui devrait être un argument de ligne de commande. Comment appelleriez-vous normalement tnccmd.exe? Quelque chose comme ça?

tnccmd.exe connect i 127.0.0.1 

Si tel est le cas, alors "se connecter i 127.0.0.1" ne devrait pas aller stdin, mais devrait être passé par P-> StartInfo-> Arguments. (Le problème avec ftp.exe n'est pas avec votre programme, mais plutôt ftp.exe lui-même, qui découvre si sa stdout est la console.Si sa sortie n'est pas sur la console, alors il ne sort pas le "ftp>" prompt.Il est également possible que le programme que vous essayez de script fasse la même chose.)

0

peut-être que c'est un problème avec la mise en mémoire tampon. Que se passe-t-il si vous essayez de vider tnc_stdin?

essayer quelque chose comme ceci:

tnc_stdin->WriteLine("connect i 127.0.0.1"); 
tnc_stdin->Flush(); 

Edit: Vérifié le cteur de StreamWriter que vous utilisez Selon elle, la taille de la mémoire tampon par défaut est 1024 octets ... de sorte que vous devez flush (règles de réflecteur!): -) ou vous pouvez définir un tampon plus petit.

public StreamWriter(string path) : 
this(path, false, new UTF8Encoding(false, true), 0x400) 
    { 
    } 
+0

Merci pour votre réponse. Cependant StreamWriter fonctionne, le problème survient avec StreamReader – Eric