StdHandle umleiten...
-
Ich hab ein kleines Programm programmiert mit dem man die stdHandle INPUT - OUTPUT der "cmd" umleiten kann. (Is nur zum testen natürlich kann man das einfacher mit system("cmd"); machen, will es aber mit Handle umleiten machen
)
#include <windows.h> #include <iostream> #include <cstdlib> #include <shlwapi.h> #define BUFSIZE 4096 using namespace std; int main() { STARTUPINFO si; PROCESS_INFORMATION pi; SECURITY_ATTRIBUTES sa; HANDLE hPipeOutRead,hPipeOutWrite, hPipeInRead, hPipeInWrite; char cPipeResult[BUFSIZE], cPipeWrite[BUFSIZE]; DWORD dwBytesRead, dwBytesWrote; // // Erstellen der Pipe sa.nLength=sizeof(sa); sa.bInheritHandle=TRUE; sa.lpSecurityDescriptor=NULL; if(!CreatePipe(&hPipeOutRead,&hPipeOutWrite, &sa, 0)) cout<<"Fehler: "<<GetLastError(); if(!CreatePipe(&hPipeInRead,&hPipeInWrite, &sa, 0)) cout<<"Fehler: "<<GetLastError(); // // Erstellen des Prozesses si.cb=sizeof(STARTUPINFO); si.lpReserved=NULL; si.lpDesktop=NULL; si.lpTitle=NULL; si.dwX=0; si.dwY=0; si.dwXSize=640; si.dwYSize=400; si.dwXCountChars=0; si.dwYCountChars=0; si.dwFillAttribute=NULL; si.dwFlags=STARTF_USESTDHANDLES; si.wShowWindow=SW_HIDE; si.cbReserved2=0; si.lpReserved2=NULL; si.hStdInput=hPipeInRead; si.hStdOutput=hPipeOutWrite; si.hStdError=GetStdHandle(STD_ERROR_HANDLE); CreateProcess(NULL, "cmd", NULL, NULL, TRUE, CREATE_DEFAULT_ERROR_MODE|NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi); WaitForSingleObject(pi.hProcess, 5000); memset(cPipeResult,0,BUFSIZE); ReadFile(hPipeOutRead,cPipeResult,sizeof(cPipeResult),&dwBytesRead,NULL); cout<<cPipeResult; while(true) { memset(cPipeWrite, 0, BUFSIZE); cin>>cPipeWrite; cPipeWrite[strlen(cPipeWrite)] = '\n'; if(!WriteFile(hPipeInWrite,cPipeWrite, sizeof(cPipeWrite),&dwBytesWrote,NULL)) cout<<"Fehler: "<<GetLastError(); WaitForSingleObject(pi.hProcess, 5000); memset(cPipeResult,0,BUFSIZE); if(!ReadFile(hPipeOutRead,cPipeResult,sizeof(cPipeResult),&dwBytesRead,NULL)) cout<<"Fehler: "<<GetLastError(); cout<<cPipeResult; } CloseHandle(pi.hProcess); system("pause"); return 0; }
Wenn man es ausführt funktioniert es beim ersten mal gut, wenn man das 2te mal einen Befehl eingibt wird immer "Mehr?" auf dem Bildschrim ausgegeben, weiß einer woran das liegen könnte!?
Gr JO
-
Also ich hätte es eigentlich nur mit freopen gemacht...
FILE *output = NULL; output = freopen("stdout.txt", "w", stdout);
funzt auch mit stderr oder stdin.
rya.
Scorcher24edit: Was verbessert..
-
Werde es mal testen...vielleicht findet ja einer noch ne Lösung für das Problem wenn man es andes macht
gr jo
und danke schon mal...