从运行进程Win32Api的pipe道输出(stdout)

我需要使用windows api获取(或pipe道)已经运行的进程的输出。

基本上我的应用程序应该允许用户select一个窗口来inputinput,并且所有input都将显示在控制台中。 我也会看看如何在以后的stderr上获得pipe道。

重要说明:我没有使用CreateProcess()或其他方法启动进程。 该进程已经在运行,我拥有的是进程的句柄(从GetWindowThreadProcessId()返回)。

无论你想做什么,你都做错了。 如果你正在与你有源代码的程序进行交互,为你的IPC创建一个定义的接口:创建一个套接字,一个命名管道,windows消息传递,共享内存段,COM服务器,或者你喜欢的IPC机制。 不要试图把IPC移植到一个不打算做IPC的程序上。

你无法控制这个过程的stdout是如何建立起来的,不是你自己的。 它是由父母的过程创造的,并且交给孩子,从那里出来,它控制着孩子。 你不要进去换别人家的地毯 。

甚至不要考虑进入这个过程,试图CloseHandle它的标准输出,并CreateFile一个新的标准输出指向您的管道。 这是一个灾难的秘诀,将导致古怪的行为和“不可能”的崩溃。

即使你可以做你想做的事情, 如果两个程序这样做会发生什么 ?

这样做的最干净的方式,而不会造成任何不良影响,如果您使用亚当隐含的交换现有的标准输出处理与你自己的方法可能会发生,是使用钩子。

如果你在现有的应用程序中注入一个线程,并用一个截获的版本交换对WriteFile的调用,它将首先给你一个正在被写入的东西的拷贝(通过句柄,源码,过滤),然后把它传递给真正的:: WriteFile伤害完成。 或者,您可以通过只更换printf或软件正在使用的调用(显然需要一些实验)来拦截更高的呼叫。

但是,当他说这不是你想要做的事情时,亚当正在发现。 这是最后的手段,所以在走下这条路线之前非常仔细地思考!

在搜索该主题的同时,从MS浏览这篇文章。 http://support.microsoft.com/kb/190351

在Unix上管道输入和输出的概念是微不足道的,似乎没有很大的理由在Windows上如此复杂。 – 卡尔