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
для множественного наследования, выполните следующие действия.
Наследуйте класс от интерфейса, например IMyInterface.
Включите DECLARE_IUNKNOWN в определение класса, чтобы объявить реализации QueryInterface, AddRef и Release , которые вызывают внешний неизвестный объект.
Переопределите NonDelegatingQueryInterface , чтобы предоставить IMyInterface с помощью следующего кода:
if (riid == IID_IMyInterface) { return GetInterface((IMyInterface *) this, ppv); } else { return CUnknown::NonDelegatingQueryInterface(riid, ppv); }
Объявите и реализуйте функции-члены IMyInterface.
Чтобы использовать INonDelegatingUnknown
для вложенных интерфейсов, выполните следующие действия.
Объявите класс, производный от CUnknown.
Включите DECLARE_IUNKNOWN в определение класса.
Переопределите NonDelegatingQueryInterface , чтобы предоставить IMyInterface с помощью следующего кода:
if (riid == IID_IMyInterface) { return GetInterface((IMyInterface *) this, ppv); } else { return CUnknown::NonDelegatingQueryInterface(riid, ppv); }
Реализуйте функции-члены IMyInterface. Используйте CUnknown::GetOwner для доступа к классу com-объектов.
В классе COM-объектов сделайте вложенный класс дружественным классом com-объектов и объявите экземпляр вложенного класса как член класса COM-объектов.
Так как необходимо всегда передавать внешний неизвестный объект и HRESULT в конструктор CUnknown , нельзя использовать конструктор по умолчанию. Необходимо сделать переменную-член указателем на класс и выполнить новый вызов в конструкторе, чтобы фактически создать ее.
Переопределите NonDelegatingQueryInterface следующим кодом:
if (riid == IID_IMyInterface) {
return m_pImplFilter->
NonDelegatingQueryInterface(IID_IMyInterface, ppv);
} else {
return CUnknown::NonDelegatingQueryInterface(riid, ppv);
}
Можно использовать смешанные классы, которые поддерживают некоторые интерфейсы с помощью множественного наследования, а некоторые — через вложенные классы.
Требования
Требование | Значение |
---|---|
Заголовок |
|
Библиотека |
|
См. также раздел