如何从MFC程序写入stdout?

时间:2011-02-23 17:28:49

标签: c++ mfc stdout

MFC程序通常无法写入stdout。 MFC在启动期间使用stdout / stdin管道做了一些奇怪的事情,你写的任何内容(例如,执行printf(“hello”);)只是转到/ dev / null。

有谁知道如何从MFC程序成功写入stdout?

感谢阅读。

5 个答案:

答案 0 :(得分:10)

使用AllocConsole功能创建用于写入的控制台。以下文章介绍了如何使用它来打印到控制台。

Creating a console for your MFC app's debug output

完成后,别忘了FreeConsole

答案 1 :(得分:8)

这是我在网上发现的一个单线程,它将stdout附加到MFC中的控制台。这允许printf和cout写入当前进程的控制台窗口。我从来没有研究过它是如何工作的,所以如果你需要一个cerr或cin版本,你就可以自己动手了。

AllocConsole();
*stdout = *_tfdopen(_open_osfhandle((intptr_t) GetStdHandle(STD_OUTPUT_HANDLE), _O_APPEND), _T("a"));

答案 2 :(得分:8)

这将附加到调用控制台窗口(如果存在)。当未从控制台调用应用程序时,GotConsoleAttach将为FALSE

GotConsoleAttach = FALSE;    
if (AttachConsole(ATTACH_PARENT_PROCESS))
{   
    int osfh = _open_osfhandle((intptr_t) GetStdHandle(STD_OUTPUT_HANDLE), 8);
    if ((HANDLE)osfh != INVALID_HANDLE_VALUE)
    {
        *stdout = *_tfdopen(osfh, _T("a"));
        GotConsoleAttach = TRUE;
    }
}

答案 3 :(得分:7)

如果您只是想要输出到调试窗口,可以使用TRACE。

TRACE("This is a debug string of text in MFC");

当我快速测试某些内容并且不想使用MessageBox(“text”)等对话框时,我会这样做。

答案 4 :(得分:2)

在花了一整天的时间尝试使用printf()和cout打印我的MFC程序后,我终于找到了一个解决方案,并决定将其发布在这里以帮助谁想要在MFC上打印...

void EnablePrintfAtMFC()
{
    if (AttachConsole(ATTACH_PARENT_PROCESS))
    {
        FILE* pCout;
        freopen_s(&pCout, "CONOUT$", "w", stdout);
        std::cout.clear();
        std::wcout.clear();
    }
}

只需在程序的某个地方调用上面的函数,然后就可以使用printf()和cout ......

EnablePrintfAtMFC();
printf("Hello world!\n");
std::cout << "It works!" << endl;