1

除非函数成功,否则官方不应使用[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析构函数将调用,因此它不会是垃圾。ReleaseNULL

3.偏执的方式,检查两者

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

在我看来,这有点冗长。


PS 见相关问题

4

2 回答 2

2

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

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

于 2009-05-04T19:47:16.817 回答
2

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

于 2009-05-05T04:03:00.337 回答