我最近将一个项目升级到了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重定向到管道?任何评论都表示赞赏。
答案 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!
}