c++ - STDOUT 重定向后,CloseHandle 在 Studio 2010 中抛出异常

标签 c++ exception redirect stdout handle

以下代码在从 Studio 2010 调试器运行时引起了麻烦,但似乎从命令行运行良好(好吧,这是因为异常仅在调试器中抛出):

HANDLE hCon = GetStdHandle( STD_OUTPUT_HANDLE );  // Preserve STDOUT
HANDLE hFile = CreateFile( pszOutputFile, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
// At this point hFile = 0x000000d0
// The file is created and has 0 bytes, as expected

// STDOUT is redirected to our new file handle
SetStdHandle( STD_OUTPUT_HANDLE, hFile );

// Do something here that pumps to STDOUT, output is directed to the file correctly
CloseHandle( hFile );  // EXCEPTION here: 0xC0000008: An invalid handle was specified.
SetStdHandle( STD_OUTPUT_HANDLE, hCon );  

一个简单的 CreateFile/CloseHandle 序列工作正常,我也尝试过切换 CloseHandle/SetStdHandle 调用的顺序但无济于事,但 GetLastError 确实返回 18 (0x12) ERROR_NO_MORE_FILES“没有更多文件。”如果 SetStdHandle 确实运行。

STDOUT 重定向失败了,但是什么?

最佳答案

所以,问题似乎是由代码的原作者巧妙隐藏的这一部分引起的:

   int fd = _open_osfhandle( (intptr_t)hFile, O_WRONLY | O_TEXT );
   _dup2( fd, 1 );
//   _close( fd );

此处注释掉的 _close 似乎是导致问题的原因。

关于c++ - STDOUT 重定向后,CloseHandle 在 Studio 2010 中抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13916045/

相关文章:

c# - 在 ListView 控件中查找控件

java - 除了异常堆栈跟踪中的行号之外,还包括源列号

c - 如何将 stderr 和 stout 重定向到多个位置?

reactjs - 如何在 React.js 中重定向

apache - 我如何在 laragon 中将 HTTP 重定向到 HTTPS

c++ - 如何从 HIP 代码内部检测 GPU 是 AMD 还是 NVIDIA

c++ - LITTLE_ENDIAN 机器也将修复 BIG_ENDIAN 代码

c++ - 从整数到 [0,1] 浮点区间的函数

c++ - 在只知道 FILE * 的 C++ 中清除文件内容

python - Python-错误的参数数量异常?