gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:32:17 25 4
gpt4 key购买 nike

我最近将一个项目升级到了 VS2015。该应用程序是基于一些使用标准输出、标准错误的平台独立库的 Windows 可执行文件。这些由应用程序重定向到单独线程中使用的单独管道,这些管道根据用户选项将消息转发到调试器、系统日志、文件或控制台(在 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 重定向到管道?任何意见表示赞赏。

最佳答案

我在迁移到 VS 2015 后遇到了这个问题。解决方案是使用 WriteFile() 函数。这会将输出重定向到标准输出。将 _open_osfhandle() 和 _fdopen() 周围的代码替换为 WriteFile()。举个例子

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

关于c++ - 动态分配的控制台 I/O 的 Visual Studio 2015 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34566070/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com