民芸的プログラミング 〜ソフトウェア開発日記〜

アクセスカウンタ

zoom RSS HRESULT_FROM_WIN32 の不思議

<<   作成日時 : 2008/10/08 00:35   >>

ブログ気持玉 0 / トラックバック 0 / コメント 0

Micorsoft の Platform SDK には COM プログラミング用の色々なマクロが含まれている。
その中で自分がよく使うマクロが HRESULT_FROM_WIN32 というもの。
Win32 のエラー番号を COM の HRESULT 値に変換するマクロだ。

MSDN によるとその内容は

#define FACILITY_WIN32 7
#define HRESULT_FROM_WIN32(x) ((HRESULT)(x) <= 0 ? ((HRESULT)(x)) \
: ((HRESULT) (((x) & 0x0000FFFF) | (FACILITY_WIN32 << 16) | 0x80000000)))

こんな感じになっている。

注意しないといけないのは、引数 x が、マクロ内で何度か参照されているということ。
なので、

HRESULT_FROM_WIN32(GetLastError())

などとやってしまうとマクロの展開の結果、2回、GetLastError() が呼び出されることとなり、効率の悪いプログラムができあがってしまう。

それと、不思議なことに、同じく MSDN の GetLastError の項目を見ると次のようなことが書かれている。

Error codes are 32-bit values (bit 31 is the most significant bit). Bit 29 is reserved for application-defined error codes; no system error code has this bit set. If you are defining an error code for your application, set this bit to one. That indicates that the error code has been defined by an application, and ensures that your error code does not conflict with any error codes defined by the system.

To convert a system error into an HRESULT value, use the HRESULT_FROM_WIN32 macro.

適当な訳:
「エラーコードは32ビット値(第31ビットが最上位)です。第29ビットはアプリケーション内で定義されたエラーコードのために予約されています。システムエラーの場合はこのビットがセットされることはありません。プログラマがアプリケーション内で固有のエラーコードを定義したい場合は、このビットを1にセットしてください。これによってそのエラーコードがアプリケーション固有のものであることが明示されるとともに、そのエラーコードがシステムのエラーコードと衝突しないことが保証されます。

システムエラーを HRESULT値に変換したい場合は、HRESULT_FROM_WIN32 マクロを使ってください」

Win32 では、32ビットのエラーコードのうち、第29ビットをセットすることで、アプリケーション固有のエラーコードを定義することができるということだ。が、解説文およびマクロの定義をつき合わせてみると、これを HRESULT_FROM_WIN32 で HRESULT 値に変換することはできないように読み取れる。HRESULT_FROM_WIN32 はあくまでシステムエラーの値を変換するためのマクロだと書かれているからだ。
しかし、せっかく、ユーザー定義のエラーコードも扱えるように Win32 のエラーコード体系が設計されているというのに、HRESULT_FROM_WIN32 ではシステムエラーの変換しかできないというのでは、どこかバランスを欠いているように思える。
しかも、第31ビットをセットすると、HRESULT_FROM_WIN32 で変換した後も、第29ビットの値はセットされたままになるという、不思議な設計となっている(第31ビットがセットされていなければ、変換で第29ビットは0にリセットされる)。

結局、このマクロを作った人は、ユーザー定義のエラーコードを HRESULT 値に変換できるようにしたかったのか、したくなかったのか。
あるいは、Win32 のエラーコードで第31ビットがセットされた場合だけは、FAIL ということで特別に扱いたかったのか。

コンセプトが分からないだけに、不気味だ。解決不可能だ。ホラーだ。

テーマ

関連テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文
HRESULT_FROM_WIN32 の不思議 民芸的プログラミング 〜ソフトウェア開発日記〜/BIGLOBEウェブリブログ
文字サイズ:       閉じる