pipes...
-
Hi,
vorweg entschuldige ich mich schonmal sollte es das falsche Forum sein, da ich mir absolut end sicher war...
Also ich hatte nach ner Möglichkeit gesucht, wie man Befehle an ein anderes Programm geben kann, hier gesucht und auf Pipes gestoßen, so nachdem ich nun mein Programm soweit fertig hab, dass es läuft und die pipe auch zu funktionieren scheint, aber das andere Programm (cmd.exe) ned reagiert auf den Befehl frag ich mich, ob ich es grundsätzlihc falsch angestellt hab, oder ob man irgendne Zeichenfolge oder sowat braucht, die wie <enter> wirkt??
Hier mein source:HANDLE hInputWrite = NULL; HANDLE hInputRead = NULL; HANDLE hError = NULL; SECURITY_ATTRIBUTES sa = {0}; PROCESS_INFORMATION pi = {0}; STARTUPINFO si ={0}; CHAR lpInput[10] = {'N','E','T',' ','U','S','E',' ','/','?'}; CHAR lpOutput[200] = {0}; DWORD nBytesWritten= 0; DWORD nBytesRead = 0; sa.nLength= sizeof(SECURITY_ATTRIBUTES); sa.lpSecurityDescriptor = NULL; sa.bInheritHandle = TRUE; LPTSTR lpszApplication = "cmd.exe"; LPTSTR lpszTitle="7357"; CreatePipe(&hInputRead, &hInputWrite, &sa, 0); si.cb = sizeof(STARTUPINFO); si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; si.lpTitle = lpszTitle; si.hStdOutput = hInputRead; si.hStdInput = hInputWrite; si.hStdError = hError; si.wShowWindow = SW_SHOW; CreateProcess(NULL,lpszApplication , NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL ,NULL, &si, &pi); WaitForInputIdle(pi.hProcess, 1000); WriteFile(hInputWrite, lpInput, 10, &nBytesWritten, NULL); lpInput[nBytesWritten] = '\0'; ReadFile(hInputRead, lpOutput, 255, &nBytesRead, NULL); lpOutput[nBytesRead] = '\0'; CListBox* pListBox= (CListBox*) GetDlgItem(IDC_LIST1); pListBox->AddString(lpOutput); CloseHandle(pi.hThread); CloseHandle(hInputRead); CloseHandle(hInputWrite);
Hoff mal ihr lacht mich ned aus, wegen dem Code.
greetz
Oss
-
Also
1.
Es IST das falsche Forum!
->Ein Prof. von mir sagte immer: 'Wenn jemand die Chance hat, zwischen 2 Möglichkeiten zu wählen, nimmt er die Falsche. q.e.d.Pipes sind eine sehr spezifische Möglichkeit, eine Software fernzusteuern. Und wenn diese Software das nicht unterstützt, kann Dein Code so gut sein wie er will, er wird nie funzen.
P.S. So gut wie keine Software unterstützt diese Möglichkeit.
Für Diskussion darüber, welche Möglichkeiten es gibt, schiebe ich das Ganze ins WinAPI-Forum!
-
Hmm, heisst das jetzt echt ich brech mir einen ab in dem Versuch der Windowskonsole nen Befehl einzutrichtern, aber das geht gar ned...?
Wenn das jetzt echt kein Mißverständnis war, dann versteh ich auch, warum
überall Sources waren, wo die Ausgabe einer Konsolenanwendung über ne Pipe ausgegeben wurde, aber nie Etwas reingeschrieben.
Naja ich hoff ja mal es gibt noch Hoffnung für mein Belang *gg*
Bitte bitte, sagt, dass es geht
greetz
Oss
-
Wieso willst du der Konsole nen Befehl unterschieben? Gibt doch bestimmt auch ne Möglichkeit das gewünschte direkt über ne WindowsAPI Funktion zu erreichen. Und über system(char* cmd) (windows.h) kann man außerdem auch befehle ausführen
-
[ Dieser Beitrag wurde am 17.05.2003 um 23:05 Uhr von volkard editiert. ]
-
Hmm also mit System() hatte ich angefangen und wenn ich mich recht entsinne, dann konnte man da einen Befehl ausführen, ich brauch aber eine Möglichkeit mehrere hintereinader auszuführen. D.h. wenn ich mit System() nen Prog starte und dann wieder nen Befehl mit System schicke, geht der ja ned an die Konsolenanwendung die läuft, sondern als neuer Befehl an die cmd.exe.
Oder? seh ich das falsch?
Es geht also ned mit den pipes... buhuhuhu
greetz
-
es geht schon mit den pipes. wirst nur ein detail alsch machen.
ich glaub', das problem, daß die startende anwendung (bei mir make.exe) ihre ausgabe mir schickte, aber die von make gestarteten nicht, hatte ich auch mal. das ist jetzt geklärt. vielleicht kannste ja mit meinem code was anfangen.int make() { HANDLE hSaveStdin,hSaveStdout,hChildStdoutRd,hChildStdoutRdDup,hChildStdoutWr,hChildStdinRd,hChildStdinWr,hChildStdinWrDup; SECURITY_ATTRIBUTES saAttr; saAttr.nLength=sizeof(SECURITY_ATTRIBUTES); saAttr.bInheritHandle=TRUE; saAttr.lpSecurityDescriptor=NULL; hSaveStdout=GetStdHandle(STD_OUTPUT_HANDLE); if(!CreatePipe(&hChildStdoutRd,&hChildStdoutWr,&saAttr,0)) throw "error"; if(!SetStdHandle(STD_OUTPUT_HANDLE,hChildStdoutWr)) throw "error"; bool fSuccess=DuplicateHandle(GetCurrentProcess(),hChildStdoutRd,GetCurrentProcess(),&hChildStdoutRdDup,0,FALSE,DUPLICATE_SAME_ACCESS); if( !fSuccess ) throw "error"; CloseHandle(hChildStdoutRd); hSaveStdin=GetStdHandle(STD_INPUT_HANDLE); if(!CreatePipe(&hChildStdinRd,&hChildStdinWr,&saAttr,0)) throw "error"; if(!SetStdHandle(STD_INPUT_HANDLE,hChildStdinRd)) throw "error"; fSuccess=DuplicateHandle(GetCurrentProcess(),hChildStdinWr,GetCurrentProcess(),&hChildStdinWrDup,0,FALSE,DUPLICATE_SAME_ACCESS); if( !fSuccess ) throw "Error"; CloseHandle(hChildStdinWr); PROCESS_INFORMATION piProcInfo; STARTUPINFO siStartInfo; ZeroMemory( &siStartInfo, sizeof(STARTUPINFO) ); siStartInfo.cb = sizeof(STARTUPINFO); siStartInfo.dwFlags = STARTF_USESTDHANDLES; siStartInfo.hStdInput = hChildStdinRd; siStartInfo.hStdOutput = hChildStdoutWr; siStartInfo.hStdError = hChildStdoutWr; BOOL ret = CreateProcess( NULL, "make", // applicatin name NULL, // process security attributes NULL, // primary thread security attributes TRUE, // handles are inherited CREATE_NO_WINDOW, // creation flags NULL, // use parent's environment NULL, // use parent's current directory &siStartInfo, // STARTUPINFO pointer &piProcInfo); // receives PROCESS_INFORMATION cout<<"cp "<<ret<<endl; DWORD dwProcessId=piProcInfo.dwProcessId; if( !SetStdHandle(STD_INPUT_HANDLE, hSaveStdin) ) throw "Error"; if( !SetStdHandle(STD_OUTPUT_HANDLE, hSaveStdout) ) throw "Error"; HANDLE handles[2]={piProcInfo.hProcess,hChildStdoutRdDup}; for(;;) { DWORD w=WaitForMultipleObjects(2,handles,FALSE,10*1000); switch(w) { case WAIT_OBJECT_0: { DWORD bread; char buf[1024]; ZeroMemory(buf,1024); DWORD br,ta,bl; PeekNamedPipe(hChildStdoutRdDup,buf,1024,&br,&ta,&bl); if(ta!=0) { bool b=ReadFile(hChildStdoutRdDup,buf,1024,&bread,NULL); cout<<bread<<' '<<buf; } DWORD exit; GetExitCodeProcess(piProcInfo.hProcess,&exit); return exit; } case WAIT_OBJECT_0 + 1: { DWORD bread; char buf[1024]; ZeroMemory(buf,1024); DWORD br,ta,bl; PeekNamedPipe(hChildStdoutRdDup,buf,1024,&br,&ta,&bl); if(ta==0) break; bool b=ReadFile(hChildStdoutRdDup,buf,1024,&bread,NULL); cout<<bread<<' '<<buf; } break; case WAIT_TIMEOUT: cout<<"timeout"<<endl; break; default: cout<<"something wrong"<<endl; } } }
wenn das auch nicht klappt, melde dich nochmal.
-
Ok, ich hatte überlesen, dass mit dem zu steuernden Programm die Konsole gemeint war. Das hast Du auch echt versteckt und in Klammern geschrieben, obwohl es sehr wichtig ist für die Beantwortung der Frage!
-
Hi, so nun heute kam mir die großartige Idee, warum das pipe heisst, is wien Rohr *gg* Da war auf jeden schonmal mein Fehler man braucht 2 Pipes, das erklärt warum ihc auch immer die Ausgabe hatte, die ich reingeschrieben hab, die Konsole ging ohne Input immer gleich zu und ich hab in ne Pipe geschrieben, sowie den selben Inhalt ausgelesen. Naja nun funzt auf jeden schonmal das auslesen aus der Konsole, jedoch hab ich noch ned geschafft was reinzuschreiben *gg*
So falls keine rmehr ne Idee hat, aknn der Thread auch gekillt werden.
greetz
Oss[ Dieser Beitrag wurde am 19.05.2003 um 20:27 Uhr von oss editiert. ]