簡體   English   中英

動態分配的控制台I / O的Visual Studio 2015問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM