DOS-Shell über Pipe steuern
-
Hallo,
ich möchte gerne über mein Programm die DOS-Shell auslesen und Befehle hinschicken. Bisher klappt das auslesen mit dem Code den ich bisher geschrieben hab auch so wie gewünscht.
Wie kann ich denn jetzt von meinem Programm aus Befehle zur DOS-Shell senden um diese dann im nachhinein wieder auszulesen?#include <windows.h> #include <stdio.h> #include <cstringt.h> int main(void) { LPTSTR exe = _T("C:\\Windows\\System32\\cmd.exe"); LPTSTR cmd = _T(" /k dir "); // ************************************* // Pipe HANDLE hReadPipe; HANDLE hWritePipe; SECURITY_ATTRIBUTES sa; //Sicherheitshinweise der Pipe sa.nLength= sizeof(SECURITY_ATTRIBUTES); //Wie groß die Struktur SEC_ATR ist sa.lpSecurityDescriptor = NULL; //Zugriffsrechte für jeden sa.bInheritHandle = TRUE; // Deklarationen für Lesebefehl char szBuffer[1024]; memset(szBuffer, 0, sizeof(szBuffer)); DWORD dwBytesRead; DWORD dwBytesToRead = sizeof(szBuffer); // Erstellen if(!CreatePipe(&hReadPipe, &hWritePipe, &sa, 0)) { printf("Problem :%d",GetLastError); } else { printf("Pipe started...\n"); } // ************************************* // Porcess STARTUPINFO si; // Infos über Größe,Ort usw der Child App. PROCESS_INFORMATION pi; // Gibt Infos über Process ID, Handle, Thread usw. Für Child App. ZeroMemory(&si, sizeof(si) ); si.cb = sizeof(si); // Größe der Struktur in Bytes wird hier ermittelt. ZeroMemory(&pi, sizeof(pi) ); si.hStdInput = NULL; si.hStdOutput = hWritePipe; si.hStdError = hWritePipe; si.dwFlags = STARTF_USESTDHANDLES; // Prozess erstellen, also dos-shell im Hintergrund aufrufen if(!CreateProcess(exe, cmd, NULL, NULL, TRUE, FALSE, NULL, NULL, &si, &pi)) { printf("CreateProcess failed (%d)\n", GetLastError()); return 0; } else { printf("CreateProcess started...\n"); } // Kanal zum Schreiben schließen CloseHandle(hWritePipe); // Daten von DOS-Shell lesen und ausgeben while(ReadFile(hReadPipe, szBuffer, (dwBytesToRead - 1), &dwBytesRead, NULL) && GetLastError() != ERROR_BROKEN_PIPE) { printf(szBuffer); memset(szBuffer, 0 , sizeof(szBuffer)); } // Warten bis die cmd geschlossen wird WaitForSingleObject( pi.hProcess, INFINITE ); // Die Shell Wieder aufräumen CloseHandle( pi.hProcess ); CloseHandle( pi.hThread ); return 1; }
-
popen
-
Könntest du mir vielleicht ein kleines Beispiel geben wie ich das da am besten reinbastle?
Wenn ich das so reinschreibe:FILE *fp; fp = _popen("cd..", "w"); CloseHandle(hWritePipe); // Daten von DOS-Shell lesen und ausgeben while(ReadFile(hReadPipe, szBuffer, (dwBytesToRead - 1), &dwBytesRead, NULL) && GetLastError() != ERROR_BROKEN_PIPE) { printf(szBuffer); memset(szBuffer, 0 , sizeof(szBuffer)); }wird leider nichts angezeigt
-
Ich hab hier mal was mit einer Pipe gemacht, vielleicht kannst Du damit was anfangen:
http://www.c-plusplus.net/forum/248213
-
cool, echt super, funktioniert ja

Danke dir!