如何从MFC程序写入stdout?

Ste*_*ett 10 c++ mfc stdout

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

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

谢谢阅读.

Naw*_*waz 10

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

为MFC应用程序的调试输出创建控制台

一旦你完成它,别忘了FreeConsole.


小智 9

在花了一整天试图让我的 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

EnablePrintfAtMFC();
printf("Hello world!\n");
std::cout << "It works!" << endl;
Run Code Online (Sandbox Code Playgroud)


Joh*_*n K 8

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

AllocConsole();
*stdout = *_tfdopen(_open_osfhandle((intptr_t) GetStdHandle(STD_OUTPUT_HANDLE), _O_APPEND), _T("a"));
Run Code Online (Sandbox Code Playgroud)


noe*_*cus 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;
    }
}
Run Code Online (Sandbox Code Playgroud)


Jas*_*onH 8

如果您只是在调试窗口中查找输出,则可以使用TRACE.

TRACE("This is a debug string of text in MFC");
Run Code Online (Sandbox Code Playgroud)

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