我的代码附加和使用来自另一个进程的控制台有什么问题?

时间:2011-08-18 16:07:21

标签: c++ winapi ipc

我有服务器进程,它的分配控制台和重定向输出和输入到该控制台。使用ShellExecute,此服务器进程会生成一些客户端,这些客户端知道服务器ProcessID。所以,我尝试使用下一课的AttachConsole:

Console::Console(DWORD dwProcessId)
{
    if (dwProcessId) {
        AttachConsole(dwProcessId);
    }
    else
        AllocConsole();

    CONSOLE_SCREEN_BUFFER_INFO coninfo;
    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo);
    coninfo.dwSize.Y = 500;
    SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize);

    int hConHandle;
    long lStdHandle;
    lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE);
    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
    FILE *fp = _fdopen( hConHandle, "w" );
    *stdout = *fp;
    setvbuf( stdout, NULL, _IONBF, 0 );

    std::ios::sync_with_stdio();
}

Console::~Console()
{
    FreeConsole();
}

但它不起作用,甚至从服务器进程擦除输出到控制台。嗯..可能只有一个进程可以输出到控制台。是否可以从多个进程向控制台发送输出?

2 个答案:

答案 0 :(得分:1)

您应该使用CONOUT$打开CreateFile。附加到控制台不会更改进程继承的星标句柄。

答案 1 :(得分:0)

有人可以告诉我为什么接下来的更改会让我的代码运行良好:

Console::Console(DWORD dwProcessId)
{
    if (dwProcessId) {
        AttachConsole(dwProcessId);
        HANDLE consoleHandle = CreateFileA("CONOUT$", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
        if (consoleHandle == INVALID_HANDLE_VALUE)
            throw 1;
        if (!SetStdHandle(STD_OUTPUT_HANDLE, consoleHandle)) 
            throw 2;
    }
    else {
        AllocConsole();
        CONSOLE_SCREEN_BUFFER_INFO coninfo;
        GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo);
        coninfo.dwSize.Y = 500;
        SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize);
    }


    int hConHandle;
    long lStdHandle;
    lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE);
    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
    FILE *fp = _fdopen( hConHandle, "w" );
    *stdout = *fp;
    setvbuf( stdout, NULL, _IONBF, 0 );
    }

现在使用ShellExecute创建的客户端可以写入服务器控制台。