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


Интерфейс IKsAggregateControl (ksproxy.h)

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

Идентификатор интерфейса (IID) для этого интерфейса IID_IKsAggregateControl.

Наследование

Интерфейс IKsAggregateControl наследуется от интерфейса IUnknown .

Методы

Интерфейс IKsAggregateControl содержит следующие методы.

 
IKsAggregateControl::KsAddAggregate

Метод KsAddAggregate добавляет COM-сервер в качестве агрегатного поставщика в список поставщиков интерфейсов для объекта KS, предоставляющего интерфейс IKsAggregateControl.
IKsAggregateControl::KsRemoveAggregate

Метод KsRemoveAggregate удаляет ранее добавленный поставщик агрегатов COM-сервера из списка поставщиков интерфейсов для объекта KS, который предоставляет интерфейс IKsAggregateControl.

Комментарии

Все наборы свойств, методов и событий, поддерживаемые фильтром или закреплением KS, могут быть представлены в представлении прокси-сервера DirectShow фильтра или закрепленного объекта нулевым или более агрегированными интерфейсами, диалогами и т. д. Эти клиентские агрегированные интерфейсы представляют собой набор расширений, которые затем можно использовать для связи с базовым объектом KS, чтобы представить функциональные возможности набора. Расширение набора — это зарегистрированный COM-сервер, который загружается через CoCreateInstance фильтром KS или закреплением во время создания дескриптора.

Основная цель расширений set — разрешить агрегирование интерфейсов, чтобы обеспечить поддержку некоторых наборов через один или несколько COM-интерфейсов. Однако реализация может также включать поддержку диалогов, асинхронную обработку в потоках и т. д. Регистрация обработчика наборов позволяет указать либо конкретный интерфейс, который требуется агрегировать, либо предоставить неименованный список интерфейсов. В первом случае к объекту отправляются только соответствующие запросы, а во втором — все запросы, которые не соответствуют интерфейсу, который уже поддерживается, отправляются в этот объект расширения.

Расширение также может получать уведомления об изменениях состояния, поддерживая интерфейс IDistributorNotify . Если объект расширения поддерживает этот интерфейс, он будет получать уведомления обо всех изменениях состояния запуска, остановки и приостановки, прежде чем фильтр обработает эти изменения. Кроме того, метод IDistributorNotify::NotifyGraphChange используется для расширений закрепленных объектов, чтобы указать, что экземпляр pin KS только что закрыт. Этот метод используется только для расширений интерфейса контакта и вызывается для объекта расширения каждый раз при отключении или повторном подключении контакта, в то время как объект расширения по-прежнему загружается и агрегируется объектом pin.

Уведомление об изменениях пин-подключения требуется, так как расширения не выгружаются при отключении пин-кода. Вместо этого расширения загружаются при первом подключении контакта и оставляются с помощью отключений и повторного подключения, если повторное подключение не указывает на то, что конкретный набор расширений больше не поддерживается в контакте. Этот факт позволяет объекту расширения сохранять состояние между повторными подключениями, но это также означает, что для расширения могут потребоваться сведения о том, подключен ли контакт KS в данный момент. Расширение может определить эти сведения, вызвав метод IKsObject::KsGetObjectHandle для запроса дескриптора объекта KS, когда расширение получает вызов NotifyGraphChange . При первой загрузке расширения можно предположить, что пин-код подключен, и любое последующее уведомление может означать отключение или повторное подключение. Таким образом, уведомление происходит после фактического изменения, в отличие от изменений состояния, которые уведомляют раньше.

Расширение набора — это, по сути, COM-сервер, который при необходимости предоставляет интерфейс IDistributorNotify и ноль или более других агрегированных интерфейсов, которые могут использоваться клиентом фильтра для управления наборами, представленными объектом расширения. При запросе на создание объекта расширения через CoCreateInstance на сервере всегда отображается внешний IUnknown , с помощью которого создается COM-объект. Этот интерфейс IUnknown является интерфейсом в фильтре или закреплении объекта, который загружает расширения набора. Указатель интерфейса IUnknown можно использовать для запроса информации или интерфейсов из фильтра или закрепления, например IKsControl. Однако на внешнем объекте не следует оставлять ссылки, так как это приведет к циклической ссылке. Использование интерфейсов без счетчика ссылок допустимо, так как расширение агрегируется внешним объектом и по определению уничтожается, когда число ссылок внешнего объекта достигает нуля.

Чтобы загрузить расширения набора, прокси-сервер ищет GUID каждого набора, полученного из фильтра или закрепления, определяя наличие каждого из них в реестре. Идентификатор GUID для каждого набора, в который нужно загрузить расширение, имеет следующий:

HKLM\System\CurrentControlSet\Control\MediaInterfaces\{set guid}

Если этот подраздел присутствует, GUID набора напрямую соответствует идентификатору GUID, используемому в параметре COM-сервера вызова CoCreateInstance . Каждый подраздел также может иметь именованное двоичное значение iid, содержащее двоичное представление GUID для интерфейса, который будет агрегироваться для этого расширения набора. Это GUID интерфейса, который приведет к отправке QueryInterface в фильтре или пин-коде на COM-сервер для этого расширения. Если это именованное значение отсутствует в подразделе , все неизвестные вызовы QueryInterface будут направляться через этот объект расширения, что позволяет поддерживать множество интерфейсов для определенного набора, доступного в базовом объекте. ИДЕНТИФИКАТОР GUID набора можно использовать в качестве идентификатора интерфейса, задав iid в качестве GUID набора или не задав значение iid. В последнем случае в объект расширения могут отправляться дополнительные запросы, которые не поддерживаются.

Хотя раздел реестра MediaInterfaces можно использовать для явного указания того, какой интерфейс (если таковой имеется) агрегирует поставщик, вся запись не обязательно должна присутствовать. Подразумевается, что любой COM-сервер может быть загружен через IKsAggregateControl , чтобы этот COM-сервер предоставлял агрегированные интерфейсы, независимо от того, указан ли COM-сервер в разделе реестра MediaInterfaces .

Для наборов, которые поддерживаются и уже имеют определенные обработчики объектов расширения, которые автоматически регистрируются во время установки или при добавлении определенного типа устройства в систему, установка драйвера не должна выполнять никаких дополнительных действий по раскрытию этих COM-интерфейсов для фильтра. Однако для предоставления com-интерфейсов для закрытых наборов необходимо добавить как запись MediaInterfaces , так и запись COM-сервера при установке фильтра.

Прокси-сервер также позволяет фильтру переопределять COM-сервер для набора, зарегистрированного в MediaInterfaces. Чтобы переопределить, создайте раздел SetAliases в разделе реестра интерфейса Plug and Play. CLSID и FriendlyName находятся в пути HKLM\...\SetAliases.

Кроме того, введите именованное значение {set guid}, которое является строковым форматом guid набора, в качестве двоичного значения GUID для заменяющего подраздела MediaInterfaces . Таким образом, для этого фильтра или любого объекта в этом фильтре все наборы с этим GUID будут использовать этот альтернативный GUID для поиска записи MediaInterfaces , а не GUID самого набора. Новая запись MediaInterfaces будет зарегистрирована как обычно.

Дополнительные сведения об IDistributorNotify, IUnknown и CoCreateInstance см. в документации по Microsoft Windows SDK.

Требования

Требование Значение
Целевая платформа Windows
Header ksproxy.h (включая Ksproxy.h)

См. также раздел

IKsControl

IKsObject::KsGetObjectHandle

KsAddAggregate

KsRemoveAggregate