Трубный вывод (stdout) из запущенного процесса Win32Api - PullRequest
19 голосов
/ 30 сентября 2011

Мне нужно получить (или передать) выходные данные процесса, который уже запущен, используя API Windows.

По сути, мое приложение должно позволять пользователю выбирать окно для передачи ввода, и весь ввод будет отображаться в консоли. Я также хотел бы узнать, как получить трубу на stderr позже.

Важно: я не запускал процесс с помощью CreateProcess () или иным образом. Процесс уже запущен, и все, что у меня есть, - это дескриптор процесса (возвращенный из GetWindowThreadProcessId ()).

Ответы [ 3 ]

4 голосов
/ 30 сентября 2011

Самый чистый способ сделать это, не вызывая каких-либо побочных эффектов, которые могут возникнуть, если вы использовали метод, подразумеваемый Адамом при замене существующего дескриптора стандартного вывода на собственный, - это использовать перехват.

Если вы вводитепоток в существующее приложение и обмен вызовами WriteFile с перехваченной версией, которая сначала даст вам копию того, что пишется (отфильтровано по дескриптору, источнику и т. д.), а затем передаст ее в real :: WriteFile без какого-либо вреда.Или вы можете перехватить вызов выше, просто отключив printf или какой-либо другой вызов, который используется программным обеспечением (очевидно, необходимы некоторые эксперименты).

ОДНАКО, Адам сразу же говорит, что это не так.т, что вы хотите сделать.Это последнее средство, поэтому подумайте очень, очень внимательно, прежде чем идти по этой линии!

0 голосов
/ 23 апреля 2012

Наткнулся на эту статью от MS при поиске по теме.http://support.microsoft.com/kb/190351

Концепция конвейерного ввода и вывода в Unix тривиальна, и, похоже, нет веской причины для такой сложности в Windows.- Карл

0 голосов
/ 30 сентября 2011

Что бы вы ни пытались сделать, вы делаете это неправильно. Если вы взаимодействуете с программой, для которой у вас есть исходный код, создайте определенный интерфейс для вашего IPC: создайте сокет, именованный канал, обмен сообщениями Windows, сегмент общей памяти, COM-сервер или любой другой предпочитаемый механизм IPC. Не пытайтесь внедрить IPC в программу, которая не собиралась делать IPC.

Вы не можете контролировать, как был настроен стандартный вывод этого процесса, и с вами не связываться. Он был создан родительским процессом и передан ребенку, и с этого момента он контролирует ребенка. Вы не заходите и не меняете ковры в чужом доме .

Даже не думайте вступать в этот процесс, пытаясь CloseHandle его стандартный вывод и CreateFile новый стандартный вывод, указывающий на ваш канал. Это рецепт катастрофы, который приведет к причудливому поведению и «невозможным» сбоям.

Даже если бы вы могли делать то, что хотели, что бы произошло, если бы две программы сделали это ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...