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



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

基本上我的应用程序应该允许用户选择一个窗口的管道输入,所有的输入将显示在一个控制台中。我也会看看如何在stderr上得到一个管道。

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

要做到这一点,而不会造成任何不良影响,例如如果您使用Adam所暗示的方法将现有的标准输出句柄与您自己的句柄交换可能会发生的不良影响,最干净的方法是使用挂钩。

如果你注入一个线程到现有的应用程序和交换调用WriteFile与拦截的版本,将首先给你一个正在写的东西的副本(过滤句柄,源,无论什么),然后把它传递给真正的::WriteFile没有伤害。或者您可以通过只交换printf或软件正在使用的任何调用来拦截更高的调用(显然需要一些实验)。

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

在搜索这个主题时看到了MS的这篇文章。http://support.microsoft.com/kb/190351

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

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

您无法控制该进程的标准输出是如何设置的,并且它不是您可以乱搞的。它由父进程创建并传递给子进程,从那时起,它就在子进程的控制之下。你不能去别人家换地毯。

不要想进入这个进程,尝试CloseHandle它的标准输出,CreateFile一个指向你的管道的新标准输出。这是一个灾难的配方,将导致奇怪的行为和"不可能的"崩溃。

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

最新更新