1

向 IUnknown::QueryInterface() 传递了一个 void** 参数,该参数表示将检索到的接口放置在哪里的地址。

STDMETHOD QueryInterface(/* [in] */ REFIID riid, /* [iid_is][out] */ void** ppvObject)

QueryInterface() 的实现应该检查这个指针是否为空(然后立即返回 E_POINTER)还是只写在那里?

我见过很多与 COM 相关的代码,几乎所有地方都没有进行检查。假设有人当然可以将空指针作为这个参数传递,但真的需要这样的检查吗?

4

3 回答 3

4

您(调用者)不需要检查指针是否不存在NULL

但是,您应该检查返回的HRESULT. E_POINTER如果输出指针是NULL并且E_NOINTERFACE接口不受支持,该方法将返回。


被调用者应该检查指针是否存在,如果是则NULL返回:E_POINTERNULL

MSDN:返回值:

S_OK如果支持接口,则此方法返回,E_NOINTERFACE否则返回。如果ppvObjectNULL,则此方法返回E_POINTER

于 2009-09-15T10:47:21.643 回答
1

根据MSDN docs,QueryInterface 要么返回 S_OK,在这种情况下 out 参数将被正确设置。或者它返回 E_NOINTERFACE,在这种情况下不会设置 out 参数。

如果您传入的 void** 为 NULL,它将返回 E_POINTER。

我不会费心检查 null,而是检查 IUnknown::QueryInterface 的返回值

检查 null 可能没有什么害处,但考虑到接口的保证,这似乎是一种多余的检查。

于 2009-09-15T10:48:16.057 回答
0

这取决于您使用的是哪种 COM 对象(或托管您的应用程序)。大多数时候只检查 HRESULT 就足够了。如果您正在处理 3rd 方对象(Explorer 替换等),您可能还应该检查 NULL。Explorer 会这样做,因此如果您想避免在有缺陷的扩展中崩溃,您也需要这样做:

于 2009-09-15T23:41:16.113 回答