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);
}
答案 0 :(得分:2)
是的,E_OUTOFMEMORY就是这个非常具体的案例。您可以在vc / atlmfc / include / atlcomcli.h
中查看源代码这与要求异常规范类似。不起作用,COM方法可以返回任何错误代码。当呼叫被整理出来或通过网络封送时,也会出现奇怪的情况。