Вывод трубы (stdout) из запущенного процесса Win32Api
Мне нужно получить (или выполнить) вывод из процесса, который уже запущен, используя api.
В основном мое приложение должно позволить пользователю выбирать окно для ввода ввода, и все входные данные будут отображаться на консоли. Я также буду смотреть, как получить трубку на stderr позже.
Важно: я не запускал процесс с помощью CreateProcess() или иным образом. Процесс уже запущен, и все, что у меня есть, - это дескриптор процесса (возвращается из GetWindowThreadProcessId()).
Ответы
Ответ 1
Что бы вы ни пытались сделать, вы делаете это неправильно. Если вы взаимодействуете с программой, для которой у вас есть исходный код, создайте определенный интерфейс для своего IPC: создайте сокет, именованный канал, обмен сообщениями Windows, сегмент разделяемой памяти, сервер COM или любой другой предпочтительный механизм IPC. Не пытайтесь перенести IPC на программу, которая не собиралась делать IPC.
У вас нет контроля над тем, как был создан этот процесс stdout, и вам не нужно возиться. Он был создан его родительским процессом и передан ребенку, а оттуда он контролирует ребенка. Вы не входите и не меняете ковры в чужом доме.
Даже не думайте об этом, пытаясь CloseHandle
его stdout, и CreateFile
новый stdout, указывающий на ваш канал. Это рецепт катастрофы и приведет к причудливому поведению и "невозможным" сбоям.
Даже если бы вы могли делать то, что хотели, что произойдет, если две программы сделают это?
Ответ 2
Самый чистый способ сделать это без каких-либо побочных эффектов, которые могут возникнуть, если вы использовали метод Adam, подразумевающий замену существующего дескриптора stdout вашим собственным, заключается в использовании hooking.
Если вы введете поток в существующее приложение и замените вызовы на WriteFile с перехваченной версией, которая сначала даст вам копию того, что написано (отфильтровано с помощью дескриптора, источника и т.д.), а затем передайте его в реальный: WriteFile без вреда. Или вы можете перехватить вызов выше, только заменяя printf или любой вызов, который использует программное обеспечение (очевидно, необходимо провести эксперименты).
ОДНАКО, Адам спот-на, когда он говорит, что это не то, что вы хотите сделать. Это последнее средство, поэтому подумайте очень, очень осторожно, прежде чем идти по этой линии!
Ответ 3
Пришел к этой статье из MS во время поиска по этой теме.
http://support.microsoft.com/kb/190351
Концепция ввода и вывода труб в Unix тривиальна, поэтому нет большой причины, чтобы она была настолько сложной в Windows. - Карл