INonDelegatingUnknown

[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 MediaPlayerIMFMediaEngine音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]

接口 INonDelegatingUnknownIUnknown 的一个版本,已重命名该版本,以启用对同一 COM 对象中的非委托 IUnknown 接口的支持。

语法

interface INonDelegatingUnknown
{
    virtual HRESULT NonDelegatingQueryInterface(REFIID riid, LPVOID *ppv) PURE;
    virtual ULONG NonDelegatingAddRef(void) PURE;
    virtual ULONG NonDelegatingRelease(void) PURE;
};

备注

若要用于 INonDelegatingUnknown 多重继承,请执行以下步骤。

  1. 从接口派生类,例如 IMyInterface。

  2. 在类定义中包含 DECLARE_IUNKNOWN ,以声明调用外部未知的 QueryInterfaceAddRefRelease 的实现。

  3. 重写 NonDelegatingQueryInterface 以使用如下代码公开 IMyInterface:

         if (riid == IID_IMyInterface) {
             return GetInterface((IMyInterface *) this, ppv);
         } else {
             return CUnknown::NonDelegatingQueryInterface(riid, ppv);
         }
    
  4. 声明并实现 IMyInterface 的成员函数。

若要将 用于 INonDelegatingUnknown 嵌套接口,请执行以下步骤:

  1. 声明派生自 CUnknown 的类。

  2. 在类定义中包含 DECLARE_IUNKNOWN

  3. 重写 NonDelegatingQueryInterface ,以使用如下所示的代码公开 IMyInterface:

         if (riid == IID_IMyInterface) {
             return GetInterface((IMyInterface *) this, ppv);
         } else {
             return CUnknown::NonDelegatingQueryInterface(riid, ppv);
         }
    
  4. 实现 IMyInterface 的成员函数。 使用 CUnknown::GetOwner 访问 COM 对象类。

  5. 在 COM 对象类中,使嵌套类成为 COM 对象类的友元,并将嵌套类的实例声明为 COM 对象类的成员。

由于必须始终将外部未知和 HRESULT 传递给 CUnknown 构造函数,因此不能使用默认构造函数。 必须使成员变量成为指向 类的指针,并在构造函数中进行新调用才能实际创建它。

使用如下代码替代 NonDelegatingQueryInterface

     if (riid == IID_IMyInterface) {
         return m_pImplFilter->
            NonDelegatingQueryInterface(IID_IMyInterface, ppv);
     } else {
         return CUnknown::NonDelegatingQueryInterface(riid, ppv);
     }

可以通过多个继承支持某些接口和通过嵌套类支持某些接口的混合类。

要求

要求
标头
Combase.h (包括 Streams.h)

Strmbase.lib (零售版本) ;
Strmbasd.lib (调试生成)

另请参阅

COM 帮助程序函数