VS2017 MFC对话框程序无法向控制台输出消息求助
解决VS2017中MFC对话框程序控制台无法输出的问题
我之前在VS版本升级时也踩过这个坑!VS2013到VS2017之间,CRT(C运行时库)的初始化逻辑有变化,你现在的代码只完成了控制台的创建和系统句柄的获取,但没把CRT的标准输出流和新创建的控制台句柄绑定起来,所以printf、cout这类CRT输出函数没法把内容送到控制台窗口里。
问题根源
VS2015及之后的CRT,默认不会自动关联AllocConsole()创建的控制台句柄,必须手动完成CRT文件流和系统句柄的绑定操作,这是旧版本VS不需要的步骤。
修正后的完整代码
#include <fcntl.h> #include <io.h> #include <stdio.h> bool Initialize(void) { HWND hWnd = GetConsoleWindow(); if (NULL != hWnd) { return true; } // 分配控制台 if (!AllocConsole()) { return false; } // 绑定标准输出 HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); if (INVALID_HANDLE_VALUE == hStdOut) { FreeConsole(); return false; } int fdOut = _open_osfhandle((intptr_t)hStdOut, _O_TEXT); FILE* fpOut = _fdopen(fdOut, "w"); *stdout = *fpOut; setvbuf(stdout, NULL, _IONBF, 0); // 关闭缓冲,实时输出 // 可选:绑定标准输入和错误输出,让输入/错误信息也能在控制台生效 HANDLE hStdIn = GetStdHandle(STD_INPUT_HANDLE); if (INVALID_HANDLE_VALUE != hStdIn) { int fdIn = _open_osfhandle((intptr_t)hStdIn, _O_TEXT); FILE* fpIn = _fdopen(fdIn, "r"); *stdin = *fpIn; setvbuf(stdin, NULL, _IONBF, 0); } HANDLE hStdErr = GetStdHandle(STD_ERROR_HANDLE); if (INVALID_HANDLE_VALUE != hStdErr) { int fdErr = _open_osfhandle((intptr_t)hStdErr, _O_TEXT); FILE* fpErr = _fdopen(fdErr, "w"); *stderr = *fpErr; setvbuf(stderr, NULL, _IONBF, 0); } return true; }
关键步骤说明
_open_osfhandle:把Windows系统的句柄(HANDLE)转换成CRT能识别的文件描述符。_fdopen:把文件描述符绑定到标准流(stdout/stdin/stderr)对应的FILE指针。setvbuf:设置无缓冲模式,避免输出内容因为缓冲堆积而不实时显示。
额外提示
如果你的项目是Unicode编码,输出中文时可能会出现乱码,可以在初始化后加上这行代码设置控制台编码:
SetConsoleOutputCP(CP_UTF8);
测试的时候,调用Initialize()之后直接用printf("控制台输出测试!\n");或者cout << "控制台输出测试!" << endl;就能看到内容了。
内容的提问来源于stack exchange,提问作者Kerwen
相关产品推荐
相关产品推荐

