为什么返回类型的AddRef()和Release()不是HRESULT

问题描述:

最近开始学习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

“AddRef和Release永远不会失败,所以将它们 返回HRESULT没有意义。” - 伊戈尔Tandetnik

我发布这只作为一个答案,因为我的眼睛是从阅读这个完整的问题和所有的意见,希望在帮助别人的希望...... SO社区,让我们这些类型问题已关闭。帮助没有这些垃圾的人们可以更容易地筛选出来。