Visual Studio 2015动态分配的控制台I / O问题

时间:2016-01-02 12:50:28

标签: c++ c redirect visual-studio-2015 stdio

我最近将一个项目升级到了VS2015。该应用程序是基于某些平台独立库的Windows可执行文件,这些库使用stdout,stderr。它们被应用程序重定向到单独的线程中使用的管道,这些管道根据用户选项将消息转发到调试器,系统日志,文件或控制台(在Windows上动态分配)。

问题是VC2015中的新CRT不支持常规方式的stdio重定向:

FILE *fp = _fdopen(new_stdout_handle, "w");
*stdout = *fp;
setvbuf(stdout, NULL, _IONBF, 0);

检查CRT源,重定向stdout的唯一方法确实是freopen,这很好将stdout重定向到文件或CONOUT $但不管道。 _dup2也不是解决方案,因为stdout和stderr的内部文件句柄在Windows可执行文件中都设置为-2。所以,似乎没有办法将stdout,stderr重定向到管道。

有没有人知道如何将stdout,stderr重定向到管道?任何评论都表示赞赏。

1 个答案:

答案 0 :(得分:0)

转到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!
}