代码之家  ›  专栏  ›  技术社区  ›  sharptooth

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

  •  1
  • sharptooth  · 技术社区  · 15 年前

    向iunknown::queryinterface()传递一个void**参数,该参数指示将检索到的接口放置到的地址。

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

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

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

    3 回复  |  直到 15 年前
        1
  •  4
  •   Mehrdad Afshari    15 年前

    你(呼叫者)不需要检查指针是否不存在 NULL .

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


    被叫方应检查指针是否 无效的 并返回 指针 如果是 无效的 :

    MSDN 返回值:

    此方法返回 S_OK 如果支持接口,并且 ENO接口 否则。如果 ppvObject 无效的 ,此方法返回 指针 .

        2
  •  1
  •   Glen    15 年前

    根据 MSDN docs ,queryinterface返回s_ok,在这种情况下,out参数将被正确设置。或者返回e_nointerface,在这种情况下,不会设置out参数。

    如果传入的void**为空,则返回e_指针。

    我不需要检查空值,而是检查iunknown::queryinterface的返回值。

    检查空值可能没有什么坏处,但是考虑到接口的保证,它看起来像是一个冗余检查。

        3
  •  0
  •   Anders    15 年前

    这取决于你是什么样的COM对象(或者你是哪个应用程序的宿主)。大多数情况下,只要检查hresult就足够了。如果您正在处理第三方对象(资源管理器替换等),您可能还应该检查是否为空。资源管理器会这样做,因此,如果您想避免在错误扩展中崩溃,还需要这样做: