是否值得在QueryInterface()实现中检查空指针?

时间:2009-09-15 10:43:58

标签: windows com com-interop iunknown

IUnknown :: QueryInterface()传递一个void **参数,表示放置检索到的接口的地址。

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

QueryInterface()的实现是否应该将此指针检查为null(然后立即返回E_POINTER)或者只是在那里写?

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

3 个答案:

答案 0 :(得分:4)

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

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


被调用方应检查指针是否为NULL,如果为E_POINTER则返回NULL

  

MSDN:返回值:

     

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

答案 1 :(得分:1)

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

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

我不打算检查null,而是检查IUnknown :: QueryInterface的返回值

检查null可能没什么坏处,但考虑到接口的保证,它似乎是一个冗余检查。

答案 2 :(得分:0)

这取决于你是什么类型的COM对象QI'ing(或者哪个应用程序托管你)。大多数时候只需检查HRESULT即可。如果您正在处理第三方对象(资源管理器替换等),您可能还应检查NULL。资源管理器执行此操作,因此您还需要避免错误扩展中的崩溃: