3

Windowsで書き込み可能HANDLEな標準エラー出力を参照することは可能ですか?WriteFile

私が尋ねている理由は、私のためにいくつかのロギング ユーティリティを書いているからです。そして、私はデータをシステムに直接渡そうとしています:

  • 物事がフラッシュされないという潜在的な問題を回避し、
  • システムがロックを必要とせずに別のスレッドからのメッセージをインターリーブできるようにします (それが実際に機能するかどうかは別の問題です)。

それ以外の場合、アプリケーションは Windows サブシステムであるため、アプリケーションが実際に標準エラーを継承している場合にのみ、どこにでも書き込む必要がありますか? それが可能なら、です。

注: へのログ シンクが既にありますOutputDebugString。また、他のいくつかのプラットフォームでも同等です。そして、追加のバッファリングを避けるために低レベル API を使用するファイルへ (メッセージは既にオンスタック バッファにアセンブルされており、すぐにフラッシュする必要があるため)。そして、標準エラーに書き込むためのファイルを書き込むためのコードも再利用したいだけです。

4

2 に答える 2

9

とともに使用GetStdHandleSTD_ERROR_HANDLEます。

HANDLE stderr = GetStdHandle(STD_ERROR_HANDLE);
WriteFile(stderr, /*...*/);
于 2013-01-07T13:12:45.140 に答える
-1

stderrは Windows ネイティブではなく、プロセスが C ランタイム ライブラリ サブシステムを初期化するまで開かれません (?)。

WriteFileが選択されたのは、それが書き込み用の最低レベルの API であるが、WriteFileの内部一貫性を損なう可能性があるためstderrです。これは明らかに適切なロックが行われていません。

デバッグ/トレースの目的で、Windows SDK はOutputDebugStringAPI を提供します。多くの Windows プログラマーは、この API とDebugViewを開発に使用しています。

一般的なログの場合は、イベント ビューアーにイベントを書き込む方が便利です。

私のお勧めは、VC++ CRTDBG ライブラリ (リンク) です。それは本当に良いです!

于 2013-01-07T14:07:25.397 に答える