Zawiesza się dlatego, ponieważ
ReadFile blokuje w momencie, gdy rura jest opróżniona. Funkcja zachowuje się podobnie do
recv, która czeka na dane jeśli nie ma ich w sockecie.
Check it out:
- Kod: Zaznacz cały
char buffer[10000];
DWORD bytes_read;
DWORD bytes_avail;
string out; while(PeekNamedPipe(hReadPipe,NULL,0,NULL,&bytes_avail,NULL) &&
bytes_avail > 0 &&
ReadFile(hReadPipe,buffer,10000,&bytes_read,NULL))
{
out.append(buffer,buffer + bytes_read);
}
Wywołaj to za
WaitForSingleObject, bo wtedy jest pewność, że aplikacja coś wtłoczyła do rury, choć nie wiem jak to będzie wyglądać z dużymi ilościami danych, przy przepełnieniu bufora rury. Najlepiej byłoby czytać przed zamknięciem aplikacji, ale to nie przejdzie z tą pętlą, trzeba by jakiś
timeout ustawić jeśli
bytes_avail == 0. No ale nieważne...
--- DODANE ---...a może i ważne

Tu masz pewniejszy algorytm czytania:
- funkcją PeekNamedPipe sprawdź, czy w rurze są jakieś dane do przeczytania.
- jeśli są, skok do 2
- jeśli nie ma, sprawdź funkcją WaitForSingleObject, czy aplikacja jest aktywna.
- jeśli jest, daj Sleep(1) i skocz do 1
- jeśli nie jest, skok do 3
- czytasz dane funkcją ReadFile i skok do 1
- koniec pętli
Całość dajesz zaraz po
CreateProcess.
Panie Kolego nie od razu Kraków zbudowano....
...ale zbudowano. Nikt za budowniczych tego nie zrobił
