从标准COM接口方法返回未记录的HRESULTS?

时间:2011-06-27 14:40:39

标签: winapi com bho hresult

从记录的标准COM对象返回未记录的HRESULTS的规则是什么?

我正在查看IObjectWithSite.SetSite的文档,其中说我应该在所有情况下返回S_OK

  

语法
  HRESULT SetSite(IUnknown *pUnkSite);

     

参数
   - pUnkSite :      [in]指向管理此对象的站点的接口指针。如果为NULL,则对象应调用IUnknown::Release以释放现有站点。

     

返回值
  在所有情况下都返回S_OK。

哪个好。但后来我正在查看一篇MSDN文章,详细介绍了如何编写一个浏览器帮助程序对象,并且有IObjectWithSite.SetSite的代码,它返回的是除了S_OK之外的HRESULTS:

  • E_INVALIDARG如果pUnkSite为NULL
  • 如果pUnkSite不支持E_INVALIDARG ,则
  • IWebBrowser2
  • E_POINTER如果webBrowser不支持IConnectionPointContainer
  • 事件连接的结果,否则(即S_OK
HRESULT CViewSource::SetSite(IUnknown *pUnkSite)
{
  // Retrieve and store the IWebBrowser2 pointer 
  m_spWebBrowser2 = pUnkSite; 
  if (m_spWebBrowser2 == NULL)
   return E_INVALIDARG;

  // Retrieve and store the IConnectionPointerContainer pointer 
  m_spCPC = m_spWebBrowser2;
  if (m_spCPC == NULL) 
   return E_POINTER;

  // Retrieve and store the HWND of the browser. Plus install
  // a keyboard hook for further use
  RetrieveBrowserWindow();

  // Connect to the container for receiving event notifications
  return Connect();
}

如果pUnkSite为NULL,代码返回E_INVALIDARG的事实看起来像一个错误,文档明确指出该参数可以为null。

该文档未提及任何其他可能的返回值 - 实际上它表示S_OK将在所有情况下返回

当然他们不能认真;他们不能指所有的情况。对?如果出现内存不足或内存保护错误,因为有人拔出了RAM棒,该怎么办?

从记录的标准COM对象返回未记录的HRESULTS的规则是什么?

1 个答案:

答案 0 :(得分:0)

当你进行COM编程时,你通常非常防守。因此,作为调用者,在调用接口函数时,可以使用着名的FAILED或SUCCEEDED宏(或使用的语言中的等价物)。

但是,当文件规定结果不重要时,建议不要检查结果。所以,作为来电者,我会做

...
myObject.SetSite(whatever);
...

而不是

...
if (FAILED(myObject.SetSite(whatever))) goto error;
...

请注意,这是非常具体的,因为SetSite是这样记录的。

如果我没有仔细阅读文档(正如你所做的那样)并假设这是一个“常规的hresult return”接口调用,我会使用FAILED宏。如果您返回任何未记录的内容,FAILED无论如何都会抓住它,无论如何我都很安全。