1

从记录的标准 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
  • E_INVALIDARG如果 pUnkSite 不支持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。

该文档没有提到任何其他 HRESULTS 作为可能的返回值 - 实际上它说在所有情况下都S_OK将返回?

当然,他们不可能是认真的;它们不能代表所有情况。正确的?如果由于有人拔出 RAM 棒而导致内存不足或内存保护故障怎么办?

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

4

1 回答 1

0

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

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

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

代替

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

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

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

于 2011-06-27T14:59:29.387 回答