IUnknown :: QueryInterface()传递一个void **参数,表示放置检索到的接口的地址。
STDMETHOD QueryInterface(/* [in] */ REFIID riid, /* [iid_is][out] */ void** ppvObject)
QueryInterface()的实现是否应该将此指针检查为null(然后立即返回E_POINTER)或者只是在那里写?
我见过很多与COM相关的代码,几乎在所有地方都没有执行检查。假设某人当然可以将空指针作为此参数传递,但是真的需要这样的检查吗?
答案 0 :(得分:4)
您(调用者)不需要检查指针是否为NULL
。
但是,您应该检查返回的HRESULT
。如果输出指针为E_POINTER
,则该方法将返回NULL
,如果不支持该接口,则返回E_NOINTERFACE
。
被调用方应检查指针是否为NULL
,如果为E_POINTER
则返回NULL
:
MSDN:返回值:
如果支持接口,则此方法返回
S_OK
,否则返回E_NOINTERFACE
。如果ppvObject
为NULL
,则此方法会返回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。资源管理器执行此操作,因此您还需要避免错误扩展中的崩溃: