【发布时间】:2011-09-23 14:09:25
【问题描述】:
从记录的标准 COM 对象返回未记录的 HRESULTS 的规则是什么?
我正在查看IObjectWithSite.SetSite 的文档,其中说我应该在所有 情况下返回S_OK:
语法
HRESULT SetSite(IUnknown *pUnkSite);参数
- pUnkSite: [在]指向管理此对象的站点的接口指针。如果为 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 的规则是什么?
【问题讨论】:
-
代码违反合约。它不仅仅是存储站点以供以后使用,而是立即使用它。这需要错误检查。它可能有效,COM 程序员永远不会忽略 HRESULT。你为什么不检查以确保。
-
在 Windows Explorer 和 Internet Explorer 加载我的 dll 的上下文中:我们得到的唯一调用是
IObjectWithSite.SetSite。