HRESULT返回值說明

HRESULT返回值說明

如果函數正常執行,則返回 S_OK,同時真正的函數運行結果則通過參數指針返回。如果遇到了異常情況,則COM系統經過判斷,會返回相應的錯誤值。

HRESULT        值          含義
S_OK            0x00000000  成功
S_FALSE         0x00000001  函數成功執行完成,但返回時出現錯誤
E_INVALIDARG    0x80070057  參數有錯誤
E_OUTOFMEMORY   0x8007000E  內存申請錯誤
E_UNEXPECTED    0x8000FFFF  未知的異常
E_NOTIMPL       0x80004001  未實現功能
E_FAIL          0x80004005  沒有詳細說明的錯誤。一般需要取得 Rich Error 錯誤信息(注1)
E_POINTER       0x80004003  無效的指針
E_HANDLE        0x80070006  無效的句柄
E_ABORT         0x80004004  終止操作
E_ACCESSDENIED  0x80070005  訪問被拒絕
E_NOINTERFACE   0x80004002  不支持接口


HRESULT 其實是一個雙字節的值,其最高位(bit)如果是0表示成功,1表示錯誤。具體參見 MSDN 之"Structure ofCOM Error Codes"說明。我們在程序中如果需要判斷返回值,則可以使用比較運算符號;switch開關語句;也可以使用VC提供的宏:

     HRESULT hr = 調用組件函數;
      if( SUCCEEDED( hr ) ){...} // 如果成功
      ......
      if( FAILED( hr ) ){...} // 如果失敗
      ......


大多數 COM 函數以及一些接口成員函數的返回值類型均爲 HRESULT 類型。HRESULT 類型的返回值反映了函數中的一些情況,其類型定義規範如下:

   31 30 2928                    1615                                0
  |-----|--|------------------------|-----------------------------------|

類別碼 (30-31) 反映函數調用結果:
                00調用成功
                01包含一些信息
                10警告
                11錯誤
自定義標記(29) 反映結果是否爲自定義標識,1 爲是,0 則不是;
操作碼 (16-28) 標識結果操作來源,在 Windows 平臺上,其定義如下:
                #defineFACILITY_WINDOWS         8
                #defineFACILITY_STORAGE         3
                #defineFACILITY_RPC            1
                #defineFACILITY_SSPI            9
                #defineFACILITY_WIN32           7
                #defineFACILITY_CONTROL         10
                #defineFACILITY_NULL            0
                #defineFACILITY_INTERNET        12
                #defineFACILITY_ITF            4
                #defineFACILITY_DISPATCH        2
                #defineFACILITY_CERT            11
操作結果碼(0-15) 反映操作的狀態,WinError.h 定義了 Win32 函數所有可能返回結果。
                以下是一些經常用到的返回值和宏定義:
                S_OK            函數執行成功,其值爲 0 (注意,其值與 TRUE 相反)
                S_FALSE        函數執行成功,其值爲 1
                S_FAIL          函數執行失敗,失敗原因不確定
                E_OUTOFMEMORY  函數執行失敗,失敗原因爲內存分配不成功
                E_NOTIMPL      函數執行失敗,成員函數沒有被實現
                E_NOTINTERFACE  函數執行失敗,組件沒有實現指定的接口

不能簡單地把返回值與 S_OK 和 S_FALSE 比較,而要用 SECCEEDED 和 FAILED 宏進行判斷。

發佈了37 篇原創文章 · 獲贊 5 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章