您如何阅读以下文档?

时间:2011-02-08 13:13:37

标签: c++ com

来自IDispatch::GetTypeInfoCount

  

从中获得的返回值   返回HRESULT是其中之一   以下:[S_OK - >成功],   [E_NOTIMPL - >失败]

底部的示例返回E_INVALIDARGNOERROR

据我所知E_INVALIDARG不是S_OK,也不是NOERROR,所以你做什么?你检查无效指针还是不检查?

COM似乎是一切的基础,而且我找不到关于简单IDispatch的正确行为的一个很好的信息来源。您如何解决生产代码中的这种不一致问题?

2 个答案:

答案 0 :(得分:6)

使用COM时,除非确实需要对这些值进行特殊处理,否则不应检查特定的返回值。相反,当您只需要知道呼叫是否失败或成功时,您应该使用FAILED或SUCCEEDED宏。即。

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

COM调用通常可以返回比文档中指定的范围更广的错误代码。被调用的函数不是唯一的错误来源。根据实际调用(进程内,进程外,DCOM),COM系统本身可以返回大量错误。

答案 1 :(得分:1)

NOERROR定义为与S_OK完全相同的值。在解除引用之前检查空指针是任何方法中的好样式,但在此示例中它应返回E_POINTER

NOERROR / S_OKE_NOTIMPL是您应该从该方法中获得的最典型值,除非您滥用该方法,该列表当然可以省略E_POINTER等代码

无论如何都不针对特定代码,请使用SUCCEEDED / FAILED宏。