CComBSTR :: AssignBSTR()的可能返回值是多少?

时间:2012-01-17 22:01:17

标签: c++ com atl smart-pointers

MSDN文章只是说:

  

返回值

     

成功时的S_OK,或任何标准的HRESULT错误值。

但是,我的猜测是E_OUTOFMEMORY是唯一可行的错误返回,因为NULL是有效输入,无效的内存位置只会引发访问冲突(希望如此)。

因此。这种方法还有其他可能的问题吗?

注意:以下全部返回S_OK:

CComBSTR bstr;
bstr.AssignBSTR(NULL);
bstr.AssignBSTR(SysAllocString(L""));   //clearly a leak, abbreviated example...
bstr.AssignBSTR(SysAllocString(L"HI"));

结论:以下是良好实践(为什么我经常看到其他实现?):

class foo {
public:
  STDMETHOD(put_Bar)(BSTR p);
private:
  CComBSTR m_bstrBar
};

STDMETHODIMP foo::put_Bar( BSTR p)
{
    return m_bstrBar.AssignBSTR(p);
}

1 个答案:

答案 0 :(得分:2)

是的,E_OUTOFMEMORY就是这个非常具体的案例。您可以在vc / atlmfc / include / atlcomcli.h

中查看源代码

这与要求异常规范类似。不起作用,COM方法可以返回任何错误代码。当呼叫被整理出来或通过网络封送时,也会出现奇怪的情况。