1

以下代码在从 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 重定向的东西失败了,但是什么?

4

1 回答 1

0

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

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

这里注释掉的 _close 似乎是导致问题的原因。

于 2012-12-17T14:34:38.227 回答