Каждый консольный процесс при своём рождении получает от системы в своё распоряжении три хендла:
Один для stdin-а
Второя для stdout-а.
Третий для stderr-а.
Если процесс создаётся просто так, то процессу даются хендлы, унаследованные от процесса-создателя. Если консоль не наследуются, то передаётся новый набор стандартных хендлов.
Если процесс запускают через командную строку так:
process1 > file1То
система оболочка командной строки открывает файл «file1» и передаёт его хендл вместо stdout и stderr.
Если процессы запускаются так:
process1 | process2 | process3 <input >outputТо оболочка командной строки запускает три процесса, открывает два файла, создаёт два пайпа и проставляет хендлы таким образом:
Таким образом, процессу можно подсунуть хендл чего угодно, что позволяет читать/писать в себя.
Тебе нужно при создании процесса твоего консольного приложения указать хендл W-конца созданного тобою пайпа, а из R-конца забирать данные. Примеров — тьма-тьмущая.