MFC程序通常无法写入stdout。 MFC在启动期间使用stdout / stdin管道做了一些奇怪的事情,你写的任何内容(例如,执行printf(“hello”);)只是转到/ dev / null。
有谁知道如何从MFC程序成功写入stdout?
感谢阅读。
答案 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;