我应该如何检查COM中的[out] params是否可以使用?

时间:2009-05-04 18:35:13

标签: com out-parameters hresult

正式一个不应该使用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();

请注意,无论如何都会发生这种情况,如果指针不是CComPtrRelease的析构函数将调用NULL,因此它不能是垃圾。

第3。偏执的方式,检查

CComPtr<IFoo> other;
HRESULT hr = foo->GetOtherFoo(&other);
if (SUCCEEDED(hr) && other) 
    other->Bar();

我认为这有点冗长。


P.S。请参阅related question

2 个答案:

答案 0 :(得分:2)

返回成功HRESULT,但将其部分输出参数设置为NULL的COM服务器方法并不常见。有一些情况(想到IClientSecurity :: QueryBlanket),但是如果方法成功返回,通常客户端可能希望所有输出参数都是非NULL。

毕竟,这是一个如何记录方法的问题。但是,在默认情况下,我会认为1.是一种安全的方式。

答案 1 :(得分:2)

如果您愿意编写更多支票并使代码变得更慢以使其更可靠,则选项3适合您。由于您希望COM服务器中存在错误,因此检查它们是非常合理的。