problem(e) mit pipe(s) + umleitung der ausgabe ... readfile list nicht ... irgend was vergessen??
-
hi unten mal ein stück code
ich will eigentlich nur die cmd öffnen und erstmal die ausgabe von der in meine winapi anwendung umleiten ... die andere richtung müsste dann ja analog laufen ...aber irgend was scheine ich noch zu vergssen?! jedenfalls kommt bei readfile nix raus ... er zeigt gleich "ende" an
achja den passenden MSDN artikel kenne ich ...
aber ehrlichgesagt bringt mir daund da das asm-tutorial zu pipes mehr
aber irgend was scheine ich zu vergessen?! ...bitte daher um hilfe

danke + cu
error
edit: habs gefunden ... arg!!! natürlich muss das False in creatprocess auf true ... man soas dummes!!... voll übersehen ...
danke(im code auch geändert!!
PAINTSTRUCT ps; HDC hdc; char buffer[1024]; DWORD bytesRead; STARTUPINFO si; PROCESS_INFORMATION pi; SECURITY_ATTRIBUTES sa; HANDLE hread, hwrite; std::string tmp=""; hdc= BeginPaint(hWnd,&ps); sa.bInheritHandle= true; sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.lpSecurityDescriptor = NULL; if(!CreatePipe(&hread,&hwrite,&sa,0)) { TextOut(hdc,100,100,TEXT("Fehler beim Erstellen der Pipe"),30); EndPaint(hWnd,&ps); return -1; } si.cb = sizeof(STARTUPINFO); GetStartupInfo(&si); si.hStdOutput= hwrite; si.hStdError=hwrite; si.dwFlags = STARTF_USESHOWWINDOW + STARTF_USESTDHANDLES; si.wShowWindow = SW_SHOW; //ZeroMemory( &pi, sizeof(pi) ); if( !CreateProcess(TEXT("c:\\Windows\\system32\\cmd.exe"), NULL , NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi )) { TextOut(hdc,100,500,TEXT("Fehler beim Erstellen des Prozesses"),35); EndPaint(hWnd,&ps); return -1; } CloseHandle(hwrite); while(true) { RtlZeroMemory(&buffer,1024); if(!ReadFile(hread,&buffer,1023,&bytesRead,NULL)) { TextOut(hdc,200,400,TEXT("ende"),4); break; } TextOut(hdc,200,100,TEXT("start"),5); tmp+=buffer; } CloseHandle(hread); EndPaint(hWnd,&ps); // Close process and thread handles. CloseHandle( pi.hProcess ); CloseHandle( pi.hThread );
-
Nur noch als Anmerkung:
Erstze: "STARTF_USESHOWWINDOW + STARTF_USESTDHANDLES" durchSTARTF_USESHOWWINDOW | STARTF_USESTDHANDLESUnd Du hast noch vergessen das "hStdInput" zu setzen!
-
jo danke
cu
-
hi
also ich habs ja nun geschafft auszulesen, doch schaff ich es nicht auch was an die cmd zu schicken, um dann das ergebnis auszulesen beispielesweise "dir"
wie muss ich jetzt vorgehen??
also ich dachte mir ich brauche dafür eine neue pipe(siehe neue pipe)
und die hänge ich an hStdInput an ?! ...soweit richtig??
dann hätte ich gedacht, dass ich mit WriteFile(..) der console schicken könnte sie soll "ir" machen
also als zeichenkette wohl "dir\n" bei WriteFile(..) um auch gleich das ENTER bei zu haben
und wenn ich dann erneut mit readfile auslese hätte ich gedacht, müsste ich die ausgabe von "dir" erhalten
naja hat jedenfalls nicht geklappt ...
also wo liegt mein denkfehler, bzw. wie müsste ich den code ergänzen/ändern??
danke + cu
error
unsigned long bio; //bytes in/out static HWND hwndEdit; char buf[1024]; //in buffer char buffer[]="dir\n"; //out buffer char app[] = "cmd.exe"; STARTUPINFO si; SECURITY_ATTRIBUTES sa; PROCESS_INFORMATION pi; HANDLE read, newread, write, newwrite; //pipe handles case WM_LBUTTONDOWN: sa.lpSecurityDescriptor = NULL; sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.bInheritHandle = true; //Pipe um vom Child zu lesen if(!CreatePipe(&newread,&read,&sa,0)) { MessageBox(hWnd,TEXT("CreatePipe"),TEXT("FEHLER"),0); CloseHandle(read); CloseHandle(newread); return -1; } //neue pipe //Pipe um in Child zu schreiben if(!CreatePipe(&newwrite,&write,&sa,0)) { MessageBox(hWnd,TEXT("CreatePipe"),TEXT("FEHLER"),0); CloseHandle(write); CloseHandle(newwrite); return -1; } si.cb = sizeof(STARTUPINFO); GetStartupInfoA(&si); si.hStdOutput= read; si.hStdError=read; si.hStdInput=write; si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES; si.wShowWindow = SW_SHOW; //child process erzeugen if (!CreateProcess(NULL,app,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi)) { MessageBox(hWnd,TEXT("CreateProcess"),TEXT("FEHLER"),0); CloseHandle(read); CloseHandle(newread); CloseHandle(write); CloseHandle(newwrite); return -1; } //nicht mehr benötigt? endlosschleife wenn nicht geschlossen!!!??? CloseHandle(read); CloseHandle(write); //hier lesen wir aus der cmd while(true) { RtlZeroMemory(&buf,1024); if(ReadFile(newread,&buf,1023,&bio,NULL)==NULL)break; SendMessage(hwndEdit,EM_SETSEL,-1,0); SendMessage(hwndEdit,EM_REPLACESEL,FALSE,(LPARAM)buf); } //jetzt wollen wir dir an die cmd schicken WriteFile(newwrite,&buffer, 10,&bio,NULL); //und das ergebnis wieder lesen //hier lesen wir dann wieder aus der cmd while(true) { RtlZeroMemory(&buf,1024); if(ReadFile(newread,&buf,1023,&bio,NULL)==NULL)break; SendMessage(hwndEdit,EM_SETSEL,-1,0); SendMessage(hwndEdit,EM_REPLACESEL,FALSE,(LPARAM)buf); } //den Rest aufräumen CloseHandle(newread); CloseHandle(newwrite); CloseHandle(pi.hThread); CloseHandle(pi.hProcess);
-
hm sorry, aber es ist mir noch immer nicht klar, wie ich das mit dem schreiben machen muss ... jedenfalls geht das so wie oben dargestellt nicht
danke für aufklärung
cu
error