除非函数成功,否则官方不应使用[out]
COM 函数中的参数,这意味着(至少)有三种方法可以查看是否[out]
可以使用参数。
考虑以下接口
interface IFoo : IUnknown {
HRESULT GetOtherFoo([out] IFoo** ppFoo);
HRESULT Bar();
};
您会推荐以下哪种方式来使用它?
1.检查返回值
CComPtr<IFoo> other;
HRESULT hr = foo->GetOtherFoo(&other);
if (SUCCEEDED(hr))
other->Bar();
这让我有点紧张,因为一个错误IFoo
可能会导致NULL
指针取消引用。
2.检查输出参数
这取决于一个事实,如果一个方法失败,它不能改变任何[out]
参数(如果参数改变了 <==> 使用它是安全的)。
CComPtr<IFoo> other;
foo->GetOtherFoo(&other);
if (other)
other->Bar();
请注意,无论如何都会发生这种情况,如果指针不存在,则CComPtr
析构函数将调用,因此它不会是垃圾。Release
NULL
3.偏执的方式,检查两者
CComPtr<IFoo> other;
HRESULT hr = foo->GetOtherFoo(&other);
if (SUCCEEDED(hr) && other)
other->Bar();
在我看来,这有点冗长。
PS 见相关问题。