2014-01-22 64 views
3

最近開始學習COM。在COM中,返回類型的函數應該是HRESULT。已閱讀有關HRESULT,與GetLastError()問題,但爲什麼,IUnknown的功能,AddRef()Release()有返回類型ULONG爲什麼返回類型的AddRef()和Release()不是HRESULT

我想出了AddRef()(幾乎)總是從QueryInterface()調用的答案,客戶端不應該調用它。而對於Release(),其返回值從不被檢查。

雖然我可以用 - 爲AddRef()來辯論我自己的答案 - 可能有客戶需要調用它的情況。而且,當客戶端可以訪問該功能時,客戶端將不會調用它的保證是什麼。

Release() - 同樣,用戶可以檢查它的返回類型,因爲他可以

請澄清。

也是這樣 - >它的約定有與COM相關的功能而不是強制的HRESULT返回類型 - >如果這是真的,它將停止我腦中的混亂。

+2

'AddRef'和'Release'永遠不會失敗,所以讓他們返回'HRESULT'沒有意義。關於你最後的問題:['[local]'](http://msdn.microsoft.com/en-us/library/windows/desktop/aa367071.aspx)方法不必返回'HRESULT'(儘管它們可以,如果他們想);所有其他方法必須返回'HRESULT'。這是因爲編組層需要能夠報告自己的錯誤(例如,如果呼叫跨越機器邊界並且遠程主機不可達,則網絡故障)。 'AddRef'和'Release'是'[local]' –

+0

不需要成功/失敗狀態(參見上面的Igor),返回值被重用於一些有用的參考計數器。這使得這些非常經常使用的方法變得輕量且性能高效。 –

+0

@IgorTandetnik感謝您的回覆。儘管如此,我仍然認爲客戶端可能需要調用AddRef()。對於例如假設客戶端具有本地接口指針,該指針將由服務器返回的有效接口指針分配。如果客戶端和服務器都是兩個不同的進程,他們的地址空間也會不同。因此,如果服務器發送「pIOne」,並且「pIOneTemp」是本地的,那麼在語句「pIOneTemp = pIOne;」之後,客戶端必須在「pIOneTemp」上調用AddRef(),因爲它駐留在完全不同的地址空間。現在爲什麼它不應該返回'HRESULT'? – user2705939

回答

0

「AddRef和Release永遠不會失敗,所以將它們 返回HRESULT沒有意義。」 - 伊戈爾Tandetnik

我發佈這隻作爲一個答案,因爲我的眼睛是從閱讀這個完整的問題和所有的意見,希望在幫助別人的希望...... SO社區,讓我們這些類型問題已關閉。幫助沒有這些垃圾的人們可以更容易地篩選出來。