Поделиться через


INonDelegatingUnknown

[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать в новом коде MediaPlayer, IMFMediaEngine и аудио/видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, в котором используются устаревшие API, чтобы по возможности использовать новые API.]

Интерфейс INonDelegatingUnknown — это версия IUnknown , переименованная для включения поддержки как неделегирующих, так и делегированных интерфейсов IUnknown в одном и том же COM-объекте.

Синтаксис

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

Remarks

Чтобы использовать INonDelegatingUnknown для множественного наследования, выполните следующие действия.

  1. Наследуйте класс от интерфейса, например IMyInterface.

  2. Включите DECLARE_IUNKNOWN в определение класса, чтобы объявить реализации QueryInterface, AddRef и Release , которые вызывают внешний неизвестный объект.

  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