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... }