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 に答える