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