2011-02-08 28 views
3

IDispatch::GetTypeInfoCount你應該如何閱讀以下文檔?

從 獲得的返回值返回HRESULT是繼 之一:[S_OK - >成功], [E_NOTIMPL - >失敗]

,並在樣品底部返回E_INVALIDARGNOERROR

據我所知E_INVALIDARG不是S_OK,也不是NOERROR,那麼你會怎麼做?你檢查無效的指針,或者你沒有?

看來,COM是一切的基礎,我找不到有關簡單IDispatch的正確行爲的一個好的信息來源。你如何處理生產代碼中的這種不一致?

+1

COM不是一切的基礎。恰恰相反,隨着時間的推移,它變得更加無關緊要。 –

+0

每當我讀到「我們應該如何......?」等問題時它總是讓我想起一位朋友仔細回答「我的朋友,仔細」 –

回答

6

使用COM,除非實際需要對這些值進行特殊處理,否則不應該檢查特定的返回值。相反,當您只需要知道呼叫是否失敗或成功時,應使用FAILED或SUCCEEDED宏。即

HRESULT hr = ...; 
if (FAILED(hr)) { 
    ... 

COM調用通常可能會返回比文檔中指定的錯誤代碼範圍更廣的範圍。被調用的函數不是唯一的錯誤來源。根據調用的實際情況(進程內,進程外,DCOM),COM系統本身可能會返回大量錯誤。

+0

但是如果我正在實施IDispatch呢?文檔說我應該返回S_OK或E_NOTIMPL,也就是說,根本沒有錯誤狀態,除了缺少的實現,在這種情況下客戶端應該回退到其他例程。但是,如果客戶端看到E_RNDOM,它可能會崩潰訪問衝突? – Coder

+0

那麼爲什麼文檔說「返回值是S_OK或E_NOTIMPL」。不應該有一個腳註說某事像「只是開玩笑^ _ ^,其實它可以是任何東西..」? –

+0

@Luther Blissett:文檔不能重複這些明顯的事情。如果你傳遞一個空指針呢?它應該返回'S_OK'還是'E_NOTIMPL'?顯然,它應該返回其他特定於空指針的其他內容。 – sharptooth

1

NOERROR被定義爲與S_OK非常相同的值。在解引用之前檢查空指針在任何方法中都是很好的樣式,但在本示例中它應該返回E_POINTER

NOERROR/S_OKE_NOTIMPL是最典型的,你應該從該法預計,除非你濫用的方法,當然這個列表可以省略代碼像E_POINTER

無論如何不針對具體的代碼,使用SUCCEEDED/FAILED宏。