2

stdout一時的にファイルにリダイレクトするには、次のことを行っています。

printf("Before");
freopen_s(&stream, "test.txt", "w", stdout);
printf("During");
freopen_s(&stream, "CONOUT$", "w", stdout);
printf("After");

それは機能しますが、次のことを行います:

CONSOLE_SCREEN_BUFFER_INFO sbi = {0};
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &sbi);

もう機能していないようです。false をGetLastError()返し6、「ハンドルが無効です」というメッセージに変換されます。とFormatMessage

ハンドルが無効である理由について何かアドバイスはありますか? 興味深いことに、printf期待どおりに機能し続けSetConsoleTextAttribute、同じハンドルでも機能します。

4

1 に答える 1

4

ここで次のことを発見しました:

hConsoleOutput [入力]

コンソール画面バッファーへのハンドル。ハンドルには、GENERIC_READ アクセス権が必要です。詳細については、コンソール バッファのセキュリティとアクセス権を参照してください。

したがって、再オープンに読み取りアクセスを追加すると、期待される機能が復元されると予想されます。たとえば、次のようになります。

printf("Before");
freopen_s(&stream, "test.txt", "w", stdout);
printf("During");
freopen_s(&stream, "CONOUT$", "w+", stdout);
printf("After");
于 2009-11-07T01:15:19.077 に答える