Probleme mit der Umleitung der Standardausgabe von CreateProcess()
-
Hallo,
meiner Meinung nach könnte das Thema sicherlich auch in einem anderen Bereich des Forums stehen, habe mich schließlich doch für WinAPI entschieden.
Ich habe zur Zeit folgendes Problem: In meinem Programm starte ich einen Prozess mit CreateProcess() und leite die Standardausgabe in ein Pipe um. Dieses werte ich später aus. Nun läuft der Prozess aber eine ganze Zeit und ich möchte dem Benutzer einen Zwischenstand geben. Soweit kein Problem, aber es wird immer ein Teil meiner Ausgabe abgeschnitten, wenn ich "zwischendurch" mal aus dem Pipe lese. Was mache ich falsch?
Hier der Ausschnitt meines Quellcodes:
// Definitionen STARTUPINFO si; PROCESS_INFORMATION pi; SECURITY_ATTRIBUTES sa; static HANDLE hPipeOutRead=INVALID_HANDLE_VALUE; static HANDLE hPipeOutWrite=INVALID_HANDLE_VALUE; char cPipeResult[BUFSIZE]; DWORD dwBytesRead; // Erstellen der Pipe sa.nLength=sizeof(sa); sa.bInheritHandle=TRUE; sa.lpSecurityDescriptor=NULL; CreatePipe(&hPipeOutRead,&hPipeOutWrite, &sa, 0); // Process Informationen ZeroMemory(&si, sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); si.lpReserved = NULL; si.lpDesktop = NULL; si.lpTitle = 0; si.dwX = si.dwY = si.dwXSize = si.dwYSize = si.dwXCountChars = si.dwYCountChars = si.dwFlags = 0; si.dwFlags=STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW; si.wShowWindow=SW_HIDE; si.lpReserved2 = NULL; si.cbReserved2 = 0; si.hStdOutput=hPipeOutWrite; si.hStdInput = si.hStdError = 0; // Nun wird versucht den Prozess zu starten if (CreateProcess(0, befehl, 0, 0, 1, 0, 0, 0, &si, &pi)) { // Warte nun so lange, bis der Prozess beendet wurde bool schleife = 1; while (schleife) { switch(WaitForSingleObject(pi.hProcess, 100)) { case WAIT_OBJECT_0: // Der Prozess ist beendet worden CloseHandle(pi.hThread); CloseHandle(pi.hProcess); memset(cPipeResult,0,BUFSIZE); ReadFile(hPipeOutRead,cPipeResult,sizeof(cPipeResult),&dwBytesRead,NULL); // // In cPipeResult habe ich nun die komplette Konsolenausgabe // // Schleife beenden schleife = 0; break; case WAIT_TIMEOUT: // Der Prozess läuft noch ... // // Hier möchte ich auch auf die Konsolendaten zugreifen, // z.B. um gleich den Inhalt aufarbeiten zu können. // Mit ReadFile(hPipeOutRead,cPipeResult,sizeof(cPipeResult),&dwBytesRead,NULL); // geht das prinzipiell auch, es fehlen aber immer ein paar Zeichen der Ausgabe. // // Hier könnte man einen Fortschrittsbalken laufen lassen oder // den Prozess beenden, falls es zu lange dauert. // Befehl: TerminateProcess(pi.hProcess,0); break; } } } else { // Fehler, der Prozess konnte nicht gestartet werden }Die wichtigen Stellen bzw. die Problemzone habe ich im Quellcode kommentiert. Derzeit prüft das Programm nur alle 100ms, ob der Prozess schon beendet ist. Wenn dem so ist, dann lese ich das Pipe aus. Der Code ist aber ja schon so aufgebaut, dass ich alle 100ms auch das Pipe auslesen könnte, selbst wenn der Prozess noch läuft. Wie gesagt - es funktioniert, es werden aber ein paar Zeichen vom Anfang des Textes gekappt.
Wie bekomme ich das hin?
Vielen Dank schon mal für die Hilfe.