Интерфейс 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 для представления функциональных возможностей набора. Расширение set — это зарегистрированный COM-сервер, который загружается через CoCreateInstance фильтром KS или закреплением во время создания дескриптора.

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

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

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

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

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

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

Если этот подраздел присутствует, GUID набора соответствует непосредственно GUID, используемому в параметре COM-сервера вызова CoCreateInstance . Каждый подраздел может также иметь именованное двоичное значение iid, содержащее двоичное представление GUID для интерфейса, который будет агрегирован для этого расширения набора. Это GUID интерфейса, который приведет к отправке запросаInterface на фильтр или закрепление на 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 (include Ksproxy.h)

См. также

IKsControl

IKsObject::KsGetObjectHandle

KsAddAggregate

KsRemoveAggregate