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



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

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

语法
 nbsp HRESULT SetSite(IUnknown *pUnkSite);

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

返回值
 nbsp 在任何情况下都返回S_OK。

这很好。但是,我看到了MSDN上的一篇文章,详细介绍了如何编写Browser Helper对象,其中有他为IObjectWithSite.SetSite编写的代码,它返回了除S_OK之外的HRESULTS:

  • 如果pUnkSite为NULL,则为E_INVALIDARG
  • 如果pUnkSite不支持IWebBrowser2,则为E_INVALIDARG
  • 如果webBrowser不支持IConnectionPointContainer,则为E_POINTER
  • 否则事件连接的结果(即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。

文档中没有提到任何其他HRESULTS作为可能的返回值——事实上,它说S_OK在任何情况下都要返回

当然他们不可能是认真的;它们并不意味着所有情况。正确的如果内存不足,或者因为有人拔出RAM棒而导致内存保护故障,该怎么办?

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

在进行COM编程时,通常都是非常防御的。因此,作为调用者,在调用接口函数时,您使用著名的FAILED或SUCCEEDED宏(或所用语言中的等效宏)。

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

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

而不是

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

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

如果我没有像你那样仔细阅读文档,并假设这是一个"常规hresult返回"接口调用,我会使用FAILED宏。如果你归还任何未记录的东西,FAILED无论如何都会抓住它,我无论如何都很安全。

相关内容

  • 没有找到相关文章