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


Шаг 3. Поддержка QueryInterface

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

Чтобы предоставить клиентам новые интерфейсы фильтра, сделайте следующее:

  • Включите макрос DECLARE_IUNKNOWN в секцию публичного объявления вашего фильтра.

    public:
        DECLARE_IUNKNOWN;
    
  • Переопределите CUnknown::NonDelegatingQueryInterface, чтобы проверить IID двух интерфейсов:

    STDMETHODIMP CGrayFilter::NonDelegatingQueryInterface(REFIID riid, void **ppv)
    {
        if (riid == IID_ISpecifyPropertyPages)
        {
            return GetInterface(
               static_cast<ISpecifyPropertyPages*>(this),
               ppv);
        }
        else if (riid == IID_ISaturation)
        {
            return GetInterface(static_cast<ISaturation*>(this), ppv);
        }
        else
        {
            // Call the parent class.
            return CBaseFilter::NonDelegatingQueryInterface(riid, ppv);
    
            // NOTE: This example assumes that the filter inherits directly
            // from CBaseFilter. If your filter inherits from another class,
            // call the NonDelegatingQueryInterface method of that class.
        }
    }
    

Далее: шаг 4. Создайте страницу свойств.

создание страницы свойств фильтра

Как реализовать IUnknown