HRESULT型の判定にSUCCEEDEDやFAILEDは使えない(ことがある)(dinop.com)dinop.comHRESULT型の判定にSUCCEEDEDやFAILEDは使えない(ことがある)解説COMインターフェースは結果をHRESULT型で返すことが多い。マクロを使って判定すると実行時に例外などのエラーが発生することがある。それは失敗時にS_FALSEを返す関数があるためだ。なる「成功」タイプの値だ。成功とは言うもののFALSEという微妙な値になっている。BOOL型でも同じような問題がある。FALSE)やif(ret)のように成功判定をする。ようには解決できない。ここから分かるようにS_OKもS_FALSEもSUCCEEDEDマクロで真(TRUE)となる。((HRESULT)(Status)<0)間違えたプログラミングCOMを使ったプログラミングで以下のようなコーディングをすることは多いのではないだろうか?つまり、ある関数の呼び出しに対してif(FAILED(hr))やif(SUCCEEDED(hr))を使ったエラー分岐処理をだ。このソースコードの中で使われているIEnumWbemClassObject::Next()は戻り値としてHRESULT型を返す。その値は失敗時にS_FALSEとなる。S_FALSEはSUCCEEDEDマクロでTRUEとなることがエラーの原因だ。IWbemClassObjectで判定すればいい。ここでは例としてIEnumWbemClassObjectという見慣れないインターフェースを使った。通常QueryInterfaceなどではS_FALSEが返ることはない。