将stdout重定向到父进程控制台窗口

时间:2014-12-12 18:23:02

标签: c++ c winapi stdout windows-console

我想实现以下情况:

  • 父进程(即cmd.exe有自己的控制台)
  • 子进程myapp.exe应该创建新的控制台窗口
  • 在子进程中,写入stdout应该写入父进程控制台
  • 如果将子进程的stdout重定向到文件,请保持这种状态

我已经设法以这种方式创建单独的控制台:

#include <windows.h>
#include <wincon.h>
#include <stdio.h>
#include <fcntl.h>
#include <io.h>

int main(int argc, char* argv[])
{
    printf("output displayed in parent process\n");

    FreeConsole();
    AllocConsole();

    printf("output displayed in child process console\n");

    // how do I redirect stdout to 
    // that one I've had before FreeConsole?

    return 0;
} 

(当stdout重定向到文件时,它工作正常:myapp.exe&gt; out.txt)

我已经尝试了很多东西,但都没有用。

int main(int argc, char* argv[])
{
    printf("output displayed in parent process\n");

    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

    FreeConsole();
    AllocConsole();

    printf("output displayed in child process console\n");

    SetStdHandle(STD_OUTPUT_HANDLE,hStdOut);
    printf("no success 1\n");        

    return 0;
} 

int main(int argc, char* argv[])
{
    printf("output displayed in parent process\n");

    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    int fd = _open_osfhandle((intptr_t)hStdOut, _O_TEXT);

    FreeConsole();
    AllocConsole();

    printf("output displayed in child process console\n");

    FILE* hf = _fdopen( fd, "w" );
    *stdout = *hf;
    setvbuf( stdout, NULL, _IONBF, 0 );

    printf("no success 2\n");        

    return 0;
} 

1 个答案:

答案 0 :(得分:3)

进程只能直接写入它所连接的控制台。如果使用自己的控制台创建子进程,或者在启动时分配自己的控制台,则无法随后写入父控制台。

如果父进程创建了一个匿名管道,它可以使用write句柄作为子进程的stdout。父进程需要为管道提供服务;例如它可能有一个线程从管道读取数据并将其写入自己的控制台。

子进程不必担心它是写入文件还是父进程。这对stdout来说都是正常的I / O.