Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
[Функция, связанная с этой страницей, DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngineи аудио и видеозахват в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать новый код MediaPlayer, IMFMediaEngine и аудио-видеозахват в Media Foundation вместо DirectShowпо возможности. Корпорация Майкрософт предлагает, что существующий код, использующий устаревшие API, будет перезаписан для использования новых API, если это возможно.]
Распространители подключаемых модулей (PID) — это способ расширения функциональных возможностей диспетчера графов фильтров. Распространитель подключаемого модуля — это COM-объект, который диспетчер фильтров агрегирует во время выполнения. Приложения получают доступ к PID через диспетчер графов фильтров.
Когда диспетчер графов фильтров запрашивается для интерфейса, который он не поддерживает, он выполняет поиск в реестре ключа со следующей формой:
HKEY_CLASSES_ROOT\Interface\IID\Distributor
IID — это строка, содержащая идентификатор интерфейса. Если запись реестра существует, значение записи определяет идентификатор класса (CLSID) идентификатора PID, который поддерживает интерфейс. Диспетчер графов фильтров объединяет ИДЕНТИФИКАТОР и возвращает указатель интерфейса, тем самым выступая в качестве внешнего IUnknown для ИДЕНТИФИКАТОРа. Когда приложение вызывает методы в интерфейсе, он фактически вызывает их в PID. Однако существование PID прозрачно для приложения.
Термин распространителя связан с тем, что piD может запрашивать внешние указателя IUnknown для интерфейсов в диспетчере графов фильтров. Вызвав метод IFilterGraph::EnumFilters, piD может перечислить фильтры в графе и распределить вызовы методов для этих фильтров. Таким образом, piD может служить одной точкой управления для приложения, чтобы вызывать методы для фильтров.
Когда диспетчер графов фильтров агрегирует идентификатор piD, он запрашивает piD для интерфейса IDistributorNotify. Если PID поддерживает этот интерфейс, диспетчер графов фильтров использует его для уведомления PID об изменениях в графе:
- Когда граф фильтра переключается между выполнением, приостановленным и остановленным состояниями, он вызывает IDistributorNotify::Run, IDistributorNotify::P auseили IDistributorNotify::Stop.
- При установке ссылочных часов диспетчер графов фильтров вызывает IDistributorNotify::SetSyncSource.
- При добавлении или удалении фильтров или изменении контактов диспетчер графов фильтров вызывает IDistributorNotify::NotifyGraphChange.
Чтобы реализовать пользовательский ИДЕНТИФИКАТОР, создайте COM-объект, поддерживающий агрегирование. Он должен поддерживать интерфейс, который диспетчер графов фильтров еще не поддерживает. Кроме того, он может поддерживать интерфейс IDistributorNotify.
Если PID получает все указатели интерфейса из диспетчера графов фильтров, он должен немедленно освободить их. В противном случае он может создать циклическое число ссылок, которое может предотвратить уничтожение диспетчера графов фильтра. Хранение количества ссылок в диспетчере графов фильтров не требуется в любом случае, так как диспетчер графов фильтров управляет временем существования PID.
Так как ИДЕНТИФИКАТОР предназначен специально для агрегирования диспетчером графов фильтров, это может потребоваться применить в методе конструктора PID. Проверьте, является ли внешний указатель IUnknownNULL, а если да, возвращает код ошибки VFW_E_NEED_OWNER. (См. коды ошибок и успешности.) Кроме того, чтобы предотвратить агрегирование идентификатора идентификатора для других объектов, можно запросить внешний указатель IUnknown для интерфейса IGraphBuilder. Возвращает код ошибки, если объект не предоставляет IGraphBuilder.