Архитектура модуля расширения Plug-In

Драйвер класса USB Video представляет единицы расширения в качестве узлов в USB Video KS прокси-фильтре. Элементы управления единиц расширения дополнительно предоставляются в пользовательском режиме в виде свойства, заданного на узле, который имеет тип KSNODETYPE_DEV_SPECIFIC. Идентификатор GUID набора свойств соответствует GUID дескриптора модуля расширения.

Отдельные элементы управления единиц расширения должны постоянно нумероваться от 1 до максимального значения n. Эти элементы управления напрямую сопоставляются с идентификаторами свойств в наборе свойств Extension Unit, и к ним можно получить доступ с помощью стандартных запросов KSPROPERTY через IKsControl.

В ответ на запросы свойств из приложений драйвер UVC возвращает значения свойств, которые имеют член MembersFlags структуры KSPROPERTY_MEMBERSHEADER , заданной исключительно для KSPROPERTY_MEMBER_RANGES. UVC не поддерживает ступенчатые диапазоны или значения единиц расширения по умолчанию произвольной длины.

Чтобы предоставить свойства модуля расширения приложению, можно написать библиотеку DLL в пользовательском режиме, которая предоставляет COM-API. Этот API можно реализовать, выполняя запросы к свойству KS, заданному с помощью интерфейса IKsControl . Vidcap.ax автоматически загружает подключаемый модуль интерфейса узла на основе определенных записей реестра. Приложение может получить доступ к интерфейсу с помощью IKsTopologyInfo::CreateNodeInstance , за которым следует вызов QueryInterface на объекте узла, чтобы получить необходимый COM-API.

Для создания и использования плагина модуля расширения требуются следующие элементы:

  • Заголовок и файл cpp, реализующий API модуля расширения и интерфейс с именем IKsNodeControl. Vidcap.ax использует интерфейс IKsNodeControl для уведомления подключаемого модуля об идентификаторе узла расширения и предоставления ему экземпляра IKsControl. Пример кода для этих файлов можно найти в DLL плагина модуля расширения.

  • Файл .rgs, который регистрирует интерфейсы узлов и идентификаторы классов (CLSID) в подразделе реестра HKLM\System\CCS\Control\NodeInterfaces\Property_Set_GUID. Записи в этом подразделе реестра содержат двоичные значения идентификатора интерфейса (IID) и CLSID. Дополнительные сведения см. в разделе "Пример записи реестра для единиц расширения UVC".

  • Приложение, вызывающее этот интерфейс. Приложение сначала создает экземпляр узла с правильным идентификатором узла с помощью IKsTopologyInfo::CreateNodeInstance. Затем приложение вызывает QueryInterface на экземпляре узла, чтобы получить необходимый интерфейс единицы расширения. Дополнительные сведения см. в Примере приложения для единиц расширения UVC и поддержке событий автоматического обновления с помощью единиц расширения.

Примеры кода в этом разделе иллюстрируют все эти элементы. См. "Создание примера блока расширения", чтобы узнать, как создать пример подключаемого модуля и связанный пример кода приложения.

После регистрации подключаемого модуля DLL и предоставленных выше записей реестра Vidcap.ax автоматически загружает соответствующие интерфейсы узлов при создании экземпляра узла.

Заметка По состоянию на Windows XP с пакетом обновления 2 (SP2) набор свойств модуля расширения поддерживается только на узле, а не в фильтре.

Рекомендации по реестру

Чтобы зарегистрировать IID и CLSID интерфейса, экспортированного подключаемым модулем, можно использовать регистрацию DLL или сведения о настройке для конкретного устройства (INF).

См. пример записи реестра для единиц расширений UVC в файле .rgs, показывающем необходимые значения для записей реестра. В этом разделе также показано, как написать INF-файл для конкретного устройства, чтобы установить USB-устройство видео и зарегистрировать библиотеку DLL подключаемого модуля. Вы можете выбрать либо регистрацию DLL, либо INF-файла для конкретного устройства в зависимости от ваших конкретных потребностей.

Схема

На следующей схеме показаны связи между различными модулями, участвующими в написании и использовании подключаемого модуля блока расширения. В частности, он отслеживает соединение от приложения к библиотеке DLL подключаемого модуля, к драйверу и, наконец, к модулю расширения на самом устройстве. Схема также иллюстрирует различные идентификаторы GUID, участвующие, идентичные значения выделены одинаковым цветом.

схема, иллюстрирующая подключаемый модуль расширения и связанные с ним модули.

Механизмы событий

Класс видео USB поддерживает события автоматического обновления, где устройство уведомляет драйвер хоста об изменениях в любом из его элементов контроля. Драйвер класса видео Microsoft USB поддерживает эту концепцию, позволяя приложениям регистрировать события автоматического обновления. Процесс получения обновлений состоит из трех этапов:

  1. Регистрация событий обновления с помощью KSEVENTSETID_VIDCAPNotify::KSEVENT_VIDCAP_AUTO_UPDATE

  2. Прослушивание событий в дескрипторе событий уведомления

  3. Отмена уведомления при завершении