正式一个不应该使用COM函数中的[out]
参数,除非函数成功,这意味着有(至少)三种方法可以查看是否可以使用[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]
参数(如果参数更改&lt; ==&gt;使用它是安全的)。
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();
我认为这有点冗长。
P.S。请参阅related question。
答案 0 :(得分:2)
返回成功HRESULT,但将其部分输出参数设置为NULL的COM服务器方法并不常见。有一些情况(想到IClientSecurity :: QueryBlanket),但是如果方法成功返回,通常客户端可能希望所有输出参数都是非NULL。
毕竟,这是一个如何记录方法的问题。但是,在默认情况下,我会认为1.是一种安全的方式。
答案 1 :(得分:2)
如果您愿意编写更多支票并使代码变得更慢以使其更可靠,则选项3适合您。由于您希望COM服务器中存在错误,因此检查它们是非常合理的。