Du liest aus hRead, welches hStdInput zugewiesen ist. Die
MSDN sieht das anders als Du:
hStdOutput
If*dwFlags*specifies STARTF_USESTDHANDLES, this member is the standard output
handle for the process.*
Danach ist hStdOutput durchaus der Output des Prozesses, nicht Deiner. Und Du hast das unbenutzte hWrite dem hStdOutput zugewiesen.
Und ich wiederhole mich: Du ignorierst die Error-Pipe (evtl „nur“ weil Du hRead statt hWrite liest)! Die wird durchaus beispielsweise auch für so etwas wie Fortschritt genutzt - das hat den Vorteil, dass ihr Output auf der Konsole landet, aber beim redirecten per Pipe nur das relevante Ergebnis im Output-Stream, da ein verarbeitendes Werkzeug den Error-Stream nur im Fehlerfall (siehe Errorcode) auswertet.