【发布时间】:2011-07-02 22:39:28
【问题描述】:
MFC 程序不能正常写入标准输出。 MFC 在启动期间对 stdout/stdin 管道做了一些奇怪的事情,而您编写的任何内容(例如执行 printf("hello");)都会转到 /dev/null。
有人知道如何从 MFC 程序成功写入标准输出吗?
感谢阅读。
【问题讨论】:
MFC 程序不能正常写入标准输出。 MFC 在启动期间对 stdout/stdin 管道做了一些奇怪的事情,而您编写的任何内容(例如执行 printf("hello");)都会转到 /dev/null。
有人知道如何从 MFC 程序成功写入标准输出吗?
感谢阅读。
【问题讨论】:
使用AllocConsole 函数创建一个用于写入的控制台。下面的文章解释了如何使用它来打印到控制台。
Creating a console for your MFC app's debug output
完成后不要忘记FreeConsole。
【讨论】:
这是我不久前在网上找到的一个单行代码,它将标准输出连接到 MFC 中的控制台。这允许 printf 和 cout 写入当前进程的控制台窗口。我从来没有研究过它是如何工作的,所以如果你需要一个 cerr 或 cin 版本,你就得靠你自己了。
AllocConsole();
*stdout = *_tfdopen(_open_osfhandle((intptr_t) GetStdHandle(STD_OUTPUT_HANDLE), _O_APPEND), _T("a"));
【讨论】:
这将附加到调用控制台窗口(如果存在)。当应用程序没有从控制台调用时,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;
}
}
【讨论】:
START /WAIT myapp.exe 以使其正常工作。
如果您只是在寻找调试窗口的输出,您可以使用 TRACE。
TRACE("This is a debug string of text in MFC");
当我快速测试某些东西并且不想使用对话框时,我会这样做,例如 MessageBox("text")。
【讨论】:
花了一整天的时间试图让我的 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;
【讨论】: