【问题标题】:how do I write to stdout from an MFC program?如何从 MFC 程序写入标准输出?
【发布时间】:2011-07-02 22:39:28
【问题描述】:

MFC 程序不能正常写入标准输出。 MFC 在启动期间对 stdout/stdin 管道做了一些奇怪的事情,而您编写的任何内容(例如执行 printf("hello");)都会转到 /dev/null。

有人知道如何从 MFC 程序成功写入标准输出吗?

感谢阅读。

【问题讨论】:

    标签: c++ mfc stdout


    【解决方案1】:

    使用AllocConsole 函数创建一个用于写入的控制台。下面的文章解释了如何使用它来打印到控制台。

    Creating a console for your MFC app's debug output

    完成后不要忘记FreeConsole。

    【讨论】:

    • 这几乎是我想要的,但是你正在创建一个新的控制台。我正在使用 AttachToConsole(ATTACH_PARENT_PROCESS) 却一无所获。但解决方案是你给我的 _cprintf() 。因此你得到积分。谢谢!
    • @Stephen:可能你也想看看AttachConsole 函数。它与您尝试的有点不同。
    • 当我从命令行调用我的 EXE 时,这会创建一个新的控制台窗口。如何将输出写入同一个控制台窗口?
    【解决方案2】:

    这是我不久前在网上找到的一个单行代码,它将标准输出连接到 MFC 中的控制台。这允许 printf 和 cout 写入当前进程的控制台窗口。我从来没有研究过它是如何工作的,所以如果你需要一个 cerr 或 cin 版本,你就得靠你自己了。

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

    【讨论】:

    • 谢谢,这对我有用。我需要包含 .
    • 这会在 Windows 10 上崩溃。
    【解决方案3】:

    这将附加到调用控制台窗口(如果存在)。当应用程序没有从控制台调用时,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;
        }
    }
    

    【讨论】:

    • 这对我很有用。附带说明一下,由于这是一个 Windows 应用程序,我使用了START /WAIT myapp.exe 以使其正常工作。
    • 这会在 Windows 10 上崩溃。
    【解决方案4】:

    如果您只是在寻找调试窗口的输出,您可以使用 TRACE。

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

    当我快速测试某些东西并且不想使用对话框时,我会这样做,例如 MessageBox("text")。

    【讨论】:

    • 这不是在回答我提出的问题。
    【解决方案5】:

    花了一整天的时间试图让我的 MFC 程序使用 printf() 和 cout 进行打印后,我终于找到了一个解决方案,并决定在这里发布它以帮助想要在 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;
    

    【讨论】:

    • 这是上述所有答案中唯一对我有用的答案 - 感谢您发布它! :)
    • 这甚至适用于 Windows 10!它适用于任何 GUI Windows 应用程序,因此您可以将其重命名为“EnablePrintfAtGUI”:)
    猜你喜欢
    • 2017-02-06
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-03
    相关资源
    最近更新 更多