【问题标题】:What are the possible return values of CComBSTR::AssignBSTR()?CComBSTR::AssignBSTR() 的可能返回值是什么?
【发布时间】:2012-02-12 17:06:18
【问题描述】:

MSDN 文章只是说:

返回值

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

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

所以。这种方法还有其他可能的 HRESULTS 吗?

注意:以下均返回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);
}

【问题讨论】:

    标签: c++ com atl smart-pointers


    【解决方案1】:

    是的,E_OUTOFMEMORY 就是在这种非常特殊的情况下。可以在vc/atlmfc/include/atlcomcli.h中看到源码

    这在其他方面类似于要求异常规范。不起作用,COM 方法可以返回 any 错误代码。当呼叫在进程外或通过网络编组时也会出现奇怪的情况。

    【讨论】:

    • 啊好的,很酷。所以通常一个 COM 方法可能会以奇怪的方式被调用,这会导致更多的错误可能性。抱歉,我已经习惯了 C#/Java,其中异常规范应该是众所周知的......(老鼠看起来这种方法不会将 NULL 和空 BSTR 视为相同)
    猜你喜欢
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 2016-02-07
    • 2011-08-24
    • 2013-06-08
    • 1970-01-01
    相关资源
    最近更新 更多