in die cmd.exe (Konsole) schreiben
-
hy, ich hab ein problem mit der cmd.exe ich möchte diese aus einer MFC Anwendung aus
starten und etwas in sie hineinschreiben.das mit dem starten klapt so bedingt nur das hineinschreiben will überhaupt nicht klappen. (glaub ich zumindest)
ich hab mich da an einem beispiel von codeproject orientiert.
http://www.codeproject.com/cpp/9505Yamaha_1.aspdort wird das auslesen einer consolenanwendung beschrieben. das auslesen aus der cmd.exe klapt auch
nur umgekehrt nicht.das was ich bisher versucht hab ist mit den rPipe & wPipe ein bischen rumzuspielen und gegeneinander
auszutauschen. Auch würde ich gern das die cmd.exe aufbleibt wenn ich den process erstelle.
nur wenn ich den flag STARTF_USESTDHANDLES übergeben schliest sich die exe sofort wieder.
wenn ich den flag weglass bleibt sie dauerhaft offen bis ich sie schließe, nur hab ich dann
ja kein zugriff mehr auf die hStd... an die ich die Pipes übergebe.andere seits öffnet und schließt sich die cmd.exe so schnell das ich mit dem flag STARTF_USESTDHANDLES
gar nicht kontrollieren kann ob ich etwas erfolgreich hinein geschrieben hab.weis da jemand rat?
STARTUPINFO sInfo; ..... sInfo.dwFlags= STARTF_USESTDHANDLES;// sInfo.hStdInput=wPipe; sInfo.hStdOutput=rPipe; sInfo.hStdError=rPipe; CloseHandle(rPipe); char buf[100] = "Das soll in die cmd.exe"; res=::WriteFile(wPipe,buf,100,&reDword,0);mfg
LowFly
-
Dazu musst Du gar nichts spezielles machen, oder ich habe Deine Bschreibung nicht verstanden.
Erzeuge ein normales Consolen Programm das stdout beschreibt. Starte dieses per CreateProcess und es wird ein entsprechendes Konsolenfenster angezeigtin das die Ausgaben geschrieben werden.
-
ja eben soweit bin ich auch und mein nächster schritt wäre eben für den benutzer etwas hineinzuschreiben was er ansonsten hineintippen müsste.
das hineinschreiben soll aus der mfc anwendung passieren.
[New Edit]
und der witz ist eben wenn ich mit dem Flag STARTF_USESTDHANDLES starte was ich ja muss um aus der anwendung lesen bzw. schreiben zu können. schliesst die cmd.exe gleich wieder.ohne den Flag STARTF_USESTDHANDLES bleibt sie zwar offen aber mir stehn die variablen zur übergabe der Pipes nicht zur verfühgung.
LowFly
-
In diesem Fall muss der entsprechende Prozess nur stdin lesen. CreateProzess.
Entsprechendes findest Du hier dokumentiert:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/creating_a_child_process_with_redirected_input_and_output.asp
-
hab da jetzt mal ein bischen rumprobiert mit dem ergebniss das jetzt zumindest mal die console offen bleibt.
leider kann ich nix eingeben weder schreibt es mir den text den es in die konsole schreiben soll hinein noch kann ich über die tastatur eingaben in die konsole machen
mein code sieht wie folgt aus.
//Formatiert neuen String fügt Pfad der Consolenanwendung & Argumente zusammen char cExecute[4096]; char cArguments[4096]; char cLongExecute[8192]; strcpy(cExecute,lpExecute); strcpy(cArguments,lpArguments); sprintf(cLongExecute,"%s %s",cExecute,cArguments); //Erstelle Sicherheitsattribute zum erstellen der Anwendung SECURITY_ATTRIBUTES secattr; ZeroMemory(&secattr,sizeof(secattr)); secattr.nLength = sizeof(secattr); secattr.bInheritHandle = TRUE; // secattr.lpSecurityDescriptor = NULL; HANDLE hChildStdinRd, hChildStdinWr, hChildStdoutRd, hChildStdoutWr; //Erstelle die Speiseleitung zum lesen und schreiben in die Console CreatePipe(&hChildStdoutRd,&hChildStdoutWr,&secattr,0); SetHandleInformation( hChildStdoutRd, HANDLE_FLAG_INHERIT, 0);// //Erstelle die Speiseleitung zum lesen und schreiben in die Console CreatePipe(&hChildStdinRd,&hChildStdinWr,&secattr,0); SetHandleInformation( hChildStdinWr, HANDLE_FLAG_INHERIT, 0);// //Processinformationen zum zerstöhren der Anwendung PROCESS_INFORMATION pInfo; ZeroMemory(&pInfo,sizeof(pInfo)); //Erstelle die Startinformationen für das Consolenfenster STARTUPINFO sInfo; ZeroMemory(&sInfo,sizeof(sInfo)); sInfo.cb = sizeof(sInfo); sInfo.dwFlags |= STARTF_USESTDHANDLES;//STARTF_USESHOWWINDOW| sInfo.hStdOutput = hChildStdoutWr; // sInfo.hStdError = hChildStdoutWr; // sInfo.hStdInput = hChildStdinRd; // // sInfo.wShowWindow = SW_SHOW; //Erstelle den Consloenprocess CreateProcess(NULL,cExecute,NULL,NULL,TRUE, NORMAL_PRIORITY_CLASS|CREATE_NEW_CONSOLE,// NULL,NULL,&sInfo,&pInfo);// CloseHandle(pInfo.hProcess); CloseHandle(pInfo.hThread); DWORD dwRead, dwWritten; CHAR chBuf[1024]="Schreib das da rein du ...."; // for(;;) // { if(!WriteFile(hChildStdinWr, chBuf, (DWORD)1024, &dwWritten, NULL));//break; // }
-
Was ist denn das für ein Programm?
Wenn es ein norales Consolen Programm ist muss es seine Eingaben von stdin lesen, sonst geht es nicht. Wenn Du die std-pipes geändert hast, dann ist für die Eingabe wie für die Ausgabe nichts anderes mehr zulässig. Will heißen: Definierst Du stdin aus einer Datei, sind Tastatureingaben nicht mehr drin.
Also nochmal: Was ist das für ein Programm?
Teste das ganze mal mit SORT!
-
hmm mal nachkucken ob ich das jetzt kapiert hab,
nun ich hab nen aufsatz (wenn man das so nennen kann) für die lib, link, dumbbin.exe usw... geschrieben mit der ich die exen direkt ansteuern kann durch hacken setzen wird der options string (zB. /EXPORTS /DEF:Mod.def) erstellt der dann an die jeweilige exe übergeben wird.
da ich mit sicherhet nicht alle optionen richtig verstanden hab, wollte ich jetzt den option string direct an die cmd.exe übergeben um direkt überprüfen zu können ob die eingabe so stimmt.
oder kann man das evtel über die zwischenablage einfügen?
SORT sagt mir jetzt gar nix?
LowFly