【问题标题】:Is it worth checking for null pointer in QueryInterface() implementation?是否值得在 QueryInterface() 实现中检查空指针?
【发布时间】:2010-11-28 10:10:12
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: windows com com-interop iunknown


    【解决方案1】:

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

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


    被调用者应该检查指针是否不是NULL,如果是NULL则返回E_POINTER

    MSDN:返回值:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-02
          • 2011-06-20
          • 2016-03-20
          • 2015-07-15
          相关资源
          最近更新 更多