CR的代码文本

all for learning about the world
  订阅 订阅  :: 管理

为窗体程序添加控制台及重新绑定输入输出流

Posted on 2013-11-10 13:17  mumuliang  阅读(549)  评论(0编辑  收藏  举报

在窗体未激活时,似乎标准输出的调用会无效。待究

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

// AllocConsole();

void printConsole(std::string s)
{
    HANDLE g_Con = GetStdHandle(STD_OUTPUT_HANDLE);
    DWORD dwWritten=0;
    WriteConsoleA(g_Con,s.c_str(),s.length(),&dwWritten,NULL);
}
void RelocationConsole(void)
{
    HANDLE  hStd;
    int     fd;
    FILE    *file;

    // 重定向标准输入流句柄到新的控制台窗口

    hStd = GetStdHandle(STD_INPUT_HANDLE);
    fd = _open_osfhandle(reinterpret_cast<intptr_t>(hStd), _O_TEXT); // 文本模式
    file = _fdopen(fd, "r");
    setvbuf(file, NULL, _IONBF, 0); // 无缓冲
    *stdin = *file;

    // 重定向标准输出流句柄到新的控制台窗口

    hStd = GetStdHandle(STD_OUTPUT_HANDLE);
    //COORD size;
    //size.X = ConsoleWidth;
    //size.Y = ConsoleHeight;
    //SetConsoleScreenBufferSize(hStd, size);
    fd = _open_osfhandle(reinterpret_cast<intptr_t>(hStd), _O_TEXT); //文本模式
    file = _fdopen(fd, "w");
    setvbuf(file, NULL, _IONBF, 0); // 无缓冲
    *stdout = *file;

    // 重定向标准错误流句柄到新的控制台窗口

    hStd = GetStdHandle(STD_ERROR_HANDLE);
    fd = _open_osfhandle(reinterpret_cast<intptr_t>(hStd), _O_TEXT); // 文本模式
    file = _fdopen(fd, "w");
    setvbuf(file, NULL, _IONBF, 0); // 无缓冲
    *stderr = *file;
}