HRESULTの戻り値が常に成功になる

RESULT result:
result=Function(void);
if(SUCCEEDED(result)){
    printf("成功 ");
}
else{
    printf("失敗 ");
}

このようなコードがあったときに、返り値が常に真になることが。。。。。

逆アセンブルしてみると

	call	Function
test eax,eax
jl _s1
push str_sok
jmp _s2
_s1: push str_sfl
_s2: call printf

ちなみに
#define S_FALSE ((HRESULT)0x00000001L)
#define SUCCEEDED(Status) ((HRESULT)(Status>=0))
#define FAILED(Status) ((HRESULT)(Status<0))
となっています。

HRESULTの返り値が負の時だけジャンプするのだから、当然といえば当然ですね。

これは、S_FALSE の定義を -1 とするのが正しそうです。

おすすめ

3件のフィードバック

  1. えむけい より:

    S_FALSEは成功ステータスの一種なので、値は1で合ってます。失敗を表すにはE_FAILという値が別途用意されています。これは(0x80004005)ですから、HRESULT(実態は符号付き32bit整数)にキャストするとちゃんと<0になります。

  2. えむけい より:

    S_FALSEは成功ステータスの一種なので、値は1で合ってます。失敗を表すにはE_FAILという値が別途用意されています。これは(0x80004005)ですから、HRESULT(実態は符号付き32bit整数)にキャストするとちゃんと<0になります。

  3. えむけい より:

    S_FALSEは成功ステータスの一種なので、値は1で合ってます。失敗を表すにはE_FAILという値が別途用意されています。これは(0x80004005)ですから、HRESULT(実態は符号付き32bit整数)にキャストするとちゃんと<0になります。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です