MFC程序通常无法写入标准输出(stdout)。MFC在启动时会对stdout/stdin管道进行一些奇怪的操作,导致您写入的任何内容(例如使用printf("hello");)都将被丢弃到/dev/null。
有人知道如何从MFC程序成功写入标准输出(stdout)吗?
谢谢阅读。
经过整整一天的尝试,使用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;
如果您只是想在调试窗口中查看输出内容,您可以使用TRACE。
TRACE("This is a debug string of text in MFC");
当我需要快速测试某些内容而不想使用对话框,比如 MessageBox("text") 时,我会这样做。
如果当前存在控制台窗口,此操作将连接到该窗口。当应用程序不是从控制台调用时,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
以使其正常工作。 - mateuscb以下是我在一段时间前在线上找到的一行代码,它将标准输出附加到MFC控制台。这使得printf和cout可以向当前进程的控制台窗口写入内容。我并没有深究其工作原理,如果您需要cerr或cin版本,请自行解决。
AllocConsole();
*stdout = *_tfdopen(_open_osfhandle((intptr_t) GetStdHandle(STD_OUTPUT_HANDLE), _O_APPEND), _T("a"));