[Windows] FAILED(S_FALSE)はfalseになる

確実にfalseに判定すると考えていた手順がtrueになっているので調べた結果、思い込みに気が付いた。

HRESULT hResult;
hResult = MyFunction();
if (FAILED(hResult))
{
      // error message
      return hResult;
}

のようなコードでMyFunction()はエラー時には S_FALSEを返す。S_FALSEではif文がtrueとなりメッセージが表示されるという想定だ。

ところが、

#define SUCCEEDED(hr) (((HRESULT)(hr)) >= 0)

//
// and the inverse
//

#define FAILED(hr) (((HRESULT)(hr)) < 0)
//
// Success codes
//
#define S_OK                                   ((HRESULT)0L)
#define S_FALSE                                ((HRESULT)1L)

となっているので、S_FALSEはエラーではなく、適切な動作の結果 「偽」という戻り値を取ったという意味で使うべき。

この代替案としては、_WIN32が定義されている場合は、

//
// MessageId: E_FAIL
//
// MessageText:
//
// Unspecified error
//
#define E_FAIL                           _HRESULT_TYPEDEF_(0x80004005L)

でよいのだろうか?

広告

コメントを残す

コメントを投稿するには、以下のいずれかでログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。