[英]Visual Studio 2015 Issues with dynamically allocated console I/O
我最近將一個項目升級到VS2015。 該應用程序是Windows可執行文件,它基於一些使用stdout,stderr的平台無關的庫。 應用程序將它們重定向到單獨線程中使用的單獨管道,這些單獨管道根據用戶選項將消息轉發到調試器,syslog,文件或控制台(在Windows上動態分配)。
問題在於,VC2015中的新CRT不支持通常的stdio重定向:
FILE *fp = _fdopen(new_stdout_handle, "w");
*stdout = *fp;
setvbuf(stdout, NULL, _IONBF, 0);
檢查CRT源,重定向stdout的唯一方法的確是freopen,這是將stdout重定向到文件或CONOUT $而不是管道的好方法。 _dup2也不是解決方案,因為Windows可執行文件中stdout和stderr的內部文件句柄都設置為-2。 因此,似乎沒有辦法將stdout,stderr重定向到管道。
有人知道如何將stdout,stderr重定向到管道嗎? 任何評論表示贊賞。
移至VS 2015后遇到了此問題。解決方案是使用WriteFile()函數。 這會將輸出重定向到stdout。 用WriteFile()替換_open_osfhandle()和_fdopen()周圍的代碼。 這是一個例子
HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
if (hStdout != INVALID_HANDLE_VALUE)
{
DWORD dwWritten;
char buf[32];
sprintf(buf, " WOW! I have been redirected to stdout!");
long len = (long)strlen(buf);
BOOL bSuccess = WriteFile(hStdout, buf, len, &dwWritten, NULL);
//if bSuccess = 1, then you succeeded!
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.