potisanのプログラミングメモ

趣味のプログラマーがプログラミング関係で気になったことや調べたことをいつでも忘れられるようにメモするブログです。はてなブログ無料版なので記事の上の方はたぶん広告です。記事中にも広告挿入されるみたいです。

WIL GitHub Wiki 最終エラー(Last error)の保存の和訳・改変

MicrosoftがGitHubでMITライセンス公開しているWILのGitHub Wikiの記事を和訳・改変したものです。素人による翻訳なので、誤訳や著作権上の問題などありましたらご連絡いただけますと幸いです。

最終エラー(Last error)の保存(原題:Last error preservation)

Raymond Chen、2020/8/24、リビジョン1個

wil::last_error_contextクラスはRAII resource wrappers(原文リンク)ライブラリの一部として wil/resource.hに定義されています。このクラスはコンストラクト時にGetLastErrorの値をキャプチャしてデストラクト時に復元します。

このクラスは値のデストラクターで実行されるライブラリコードで便利です。ライブラリコードが(Win32 APIの呼び出し等で)GetLastErrorの値を何気なく変更する場合、ユーザーの期待するGetLastErrorの値を保存するためにライブラリ関数の呼び出し前にこの型の値をインスタンス化すべきです。

カーネルモードではこのクラスは何もしません。しかし、カーネルモードとユーザーモードの違いからwilライブラリを隔離するため、このクラスの定義は残ります。

  • コンストラクタ: last_error_context()は引数を受け取りません。
  • ムーブ代入およびムーブ・コピー可能。エラーコードを復元するいずれの責任もムーブ先のオブジェクトに転移されます。
  • releaseメソッドはエラーコードを復元する責任を削除します。
void LogMessage(...)
{
    // メッセージのログはGetLastErrorを変更すべきではない。
    auto preserveLastError = wil::last_error_context();

    // ログコードはメモリ確保やファイル書き込みを行い、
    // それらはGetLastErrorを変更する場合がある。
    // でも大丈夫。preserveLastErrorがエラーコードを復元してくれる。
    ... logging code...
}