Шаг 2. Имплементация ISpecifyPropertyPages

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

Затем реализуйте интерфейс ISpecifyPropertyPages в фильтре. Этот интерфейс имеет один метод, GetPages, который возвращает массив CLSID для страниц свойств, поддерживаемых фильтром. В этом примере фильтр имеет одну страницу свойств. Начните с создания CLSID и объявления его в файле заголовка:

// Always create new GUIDs! Never copy a GUID from an example.
DEFINE_GUID(CLSID_SaturationProp, 0xa9bd4eb, 0xded5, 
0x4df0, 0xba, 0xf6, 0x2c, 0xea, 0x23, 0xf5, 0x72, 0x61);

Теперь реализуйте метод GetPages:

class CGrayFilter : public ISaturation,
                    public ISpecifyPropertyPages, 
                    /* Other inherited classes. */
{
public:
    STDMETHODIMP GetPages(CAUUID *pPages)
    {
        if (pPages == NULL) return E_POINTER;
        pPages->cElems = 1;
        pPages->pElems = (GUID*)CoTaskMemAlloc(sizeof(GUID));
        if (pPages->pElems == NULL) 
        {
            return E_OUTOFMEMORY;
        }
        pPages->pElems[0] = CLSID_SaturationProp;
        return S_OK;
    }
};

/* ... */

}

Выделите память для массива с помощью CoTaskMemAlloc. Вызывающий объект освободит память.

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

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