ReadFile auf Pipe kommt nicht zurück

jokey2

Erfahrenes Mitglied
Hallo Leute!

ich möchte in einer Funktion einen Prozess starten und dessen Ausgaben in einem Fenster ausgeben. Nach meinem Wissen sollte das eigentlich so funktionieren:
Code:
BOOL CLeftView::ProcessCommandLine(CString cstrCommandLine)
    {
    	BOOL bOK = TRUE;
    
    	STARTUPINFO si;
    	PROCESS_INFORMATION pi;
    	SECURITY_ATTRIBUTES sa;
    	HANDLE hReadPipe, hWritePipe;
    	char * pcCommandLine;
    	DWORD dwWaitResult = WAIT_TIMEOUT, dwBytesRead, dwExitCode;
    	char cReadLine[MAX_LINE_LENGTH];
    
    	ZeroMemory(&si, sizeof(si));
    	si.cb = sizeof(si);
    
    	//Pipes erzeugen
    	sa.nLength=sizeof(sa);
    	sa.bInheritHandle=TRUE;
    	sa.lpSecurityDescriptor=NULL;
    	bOK = CreatePipe(&hReadPipe, &hWritePipe, &sa, 0);
    	if(!bOK)
    	{
    		//FEHLER
    		return FALSE;
    	}
    
    	//Pipes eintragen
    	si.dwFlags = STARTF_USESTDHANDLES;
    	si.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
    	si.hStdOutput = hWritePipe;
    	si.hStdError = hWritePipe;
    
    	//Prozess starten
    	pcCommandLine = (char*)(LPCTSTR)cstrCommandLine;
    	bOK = CreateProcess(NULL, 
 						pcCommandLine,
 						NULL,
 						NULL,
 						TRUE,
    		    		    CREATE_NEW_CONSOLE,
 						NULL,
 						NULL,
 						&si,
 						&pi);
    	if(!bOK)
    	{
    		//FEHLER
    		return FALSE;
    	}
    
    	//Auf Ende warten und Messages lesen
    	while(dwWaitResult != WAIT_OBJECT_0)
    	{
    		ZeroMemory(cReadLine, MAX_LINE_LENGTH);
    		if(ReadFile(hReadPipe, cReadLine, 1, &dwBytesRead, NULL))
    		{
    			m_pBottomView->LogMessage(CString(cReadLine));
    		}
    		dwWaitResult = WaitForSingleObject(pi.hProcess, 1);
    	}
    
    	bOK = GetExitCodeProcess(pi.hProcess, &dwExitCode);
    
    	//Close handles
    	CloseHandle(pi.hProcess);
    	CloseHandle(pi.hThread);
    	CloseHandle(hWritePipe);
    	CloseHandle(hReadPipe);
    	
    	return bOK;
    }
Das Dumme ist: es funktioniert nicht. Der Prozess wird zwar gestartet, aber der ReadFile - Aufruf kommt nicht mehr zurück, auch nicht dann, wenn der Prozess beendet ist. Eigentlich sollte die Funktion zurückkehren, wenn ein Zeichen gelesen ist oder der Prozess beendet ist. Vielleicht kann mir einer sagen, was ich da falsch mache.

Danke und Grüße,

jokey2
 
Hab' inzwischen was rausgefunden: ReadFile kommt dann nicht zurück, wenn nichts von der anderen Seite in die Pipe geschrieben wurde, auch nicht, wenn der erzeugte Prozess schon beendet ist. Daher prüfe ich vor dem Lesen mit GetFileSize, ob etas in der Pipe ist. Nur dann lese ich auch, das klappt ganz gut soweit, man muß es nur wissen. In den MSDN steht nämlich was anderes.

Grüße, jokey2
 

Neue Beiträge

Zurück