我创建了一个基于 MFC 对话框的应用程序。在 VS2013 中,我可以创建一个控制台窗口并输出消息。当我升级到 VS2017 时,执行相同的代码,创建了控制台窗口但没有消息输出。下面是我的代码:
bool Initialize(void)
{
HWND hWnd = GetConsoleWindow();
if (NULL != hWnd)
{
return true;
}
if (!AllocConsole())
{
return false;
}
HANDLE m_hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
if (INVALID_HANDLE_VALUE == m_hStdOut)
{
return false;
}
int m_hCrt = _open_osfhandle((intptr_t)m_hStdOut, _O_TEXT);
if (-1 == m_hCrt)
{
return false;
}
FILE* m_pCrtFile = _fdopen(m_hCrt, "w");
*stdout = *m_pCrtFile;
int ret = setvbuf(stdout, NULL, _IONBF, 0);
if (-1 == ret)
{
return false;
}
return true;
}
void WriteLine(LPCTSTR lpszText)
{
Initialize();
std::wcout << lpszText;
std::wcout << std::endl;
std::wcout.flush();
system("pause");
}
BOOL CMFCApplication1App::InitInstance()
{
WriteLine(_T("test"));
...
}
问题: 我应该如何修改我的代码以将消息输出到 VS2017 中的控制台?
最佳答案
添加对 freopen
的调用(或 freopen_s
以避免安全警告)以重新打开 stdout
。还要添加 _dup2
以将 stdout
与控制台的文件描述符相关联。
_setmode(_fileno(stdout), _O_U16TEXT)
需要打印 Unicode(std::cout
将不可用,除非您将模式设置回 _O_TEXT
)。
bool Initialize()
{
if(GetConsoleWindow())
return true;
if(!AllocConsole())
return false;
HANDLE m_hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
if(m_hStdOut == INVALID_HANDLE_VALUE)
return false;
//get file descriptor from handle
int m_hCrt = _open_osfhandle((intptr_t)m_hStdOut, _O_TEXT);
if(m_hCrt == -1)
return false;
FILE* m_pCrtFile = _fdopen(m_hCrt, "w");
if(!m_pCrtFile)
return false;
FILE* notused;
freopen_s(¬used, "CONOUT$", "w", stdout);
//associate m_pCrtFile with `stdout`
if(_dup2(_fileno(m_pCrtFile), _fileno(stdout)) != 0)
return false;
setvbuf(stdout, NULL, _IONBF, 0);
_setmode(_fileno(stdout), _O_U16TEXT);
std::wcout << L"123 ελληνικά Иванчо English\n";
return true;
}
关于c++ - VS2017 MFC 无法向控制台输出消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49851630/