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

Dav*_*vid 19 windows winapi

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

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

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

Ada*_*eld -10

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

您无法控制该进程的标准输出是如何设置的,并且它不是您可以乱搞的。它由其父进程创建并移交给子进程,从那里开始,它就由子进程控制。 你不会进去换别人家的地毯

甚至不要考虑进入该进程,尝试CloseHandle其标准输出,以及CreateFile指向您的管道的新标准输出。这会导致灾难,并会导致古怪的行为和“不可能的”崩溃。

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

  • 这样做有很多正当的理由,我不认为一揽子“不要这样做”的答案一定是要走的路。虽然我确实同意在大多数情况下这是错误的选择;尽管如此,对于某些情况来说,它仍然是一个有效的解决方案。 (14认同)
  • 永远不要改变……只是无形地观察和“监控”。在很多情况下,我不得不让一个进程与另一个没有源代码的进程交互/协同工作。诚然,这些通常不是控制台应用程序,但我不仅可以看到这种情况的发生。 (4认同)
  • 我厌倦了这种对 SO 进行黑客攻击和逆向工程的消极态度。我这样做的原因是调试我注入的 DLL 文件,而不像您建议的那样创建复杂的 API。 (3认同)
  • @David:您是否尝试过使用[进程监视器](http://technet.microsoft.com/en-us/sysinternals/bb896645)?您想要做的事情在用户空间中根本无法实现,没有类似的公共 API。另一方面,内核模式是一个完全不同的野兽——请参阅[这个答案](http://stackoverflow.com/questions/4833972/how-does-sysinternals-processmonitor-work/4834010#4834010)了解一个想法Process Monitor 的工作原理以及如何开始使用它。 (2认同)