我应该如何检查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.是一条安全的路。