Архитектура Plug-In модулей расширения
Драйвер видеокласса USB предоставляет единицы расширения в качестве узлов в фильтре прокси-сервера USB Video KS. Элементы управления Extension Unit дополнительно предоставляются в пользовательском режиме в виде свойства, заданного на узле, который имеет тип KSNODETYPE_DEV_SPECIFIC. GUID набора свойств соответствует GUID дескриптора модуля расширения.
Отдельные элементы управления Единица расширения должны постоянно нумероваться от 1 до некоторого максимального значения n. Эти элементы управления напрямую сопоставляются с идентификаторами свойств (ID) в наборе свойств 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) набор свойств Extension Unit поддерживается только на узле, а не в фильтре.
Рекомендации по реестру
Чтобы зарегистрировать IID и CLSID интерфейса, экспортированного подключаемым модулем, можно использовать регистрацию DLL или файл сведений о настройке для конкретного устройства (INF).
Пример RGS-файла, в который отображаются необходимые значения для записей реестра, см. в разделе Пример записи реестра для единиц расширения UVC. В этом разделе также показано, как записать INF-файл для конкретного устройства для установки видеоустройства USB и регистрации подключаемой библиотеки DLL. Вы можете выбрать регистрацию БИБЛИОТЕКи DLL или INF-файл для конкретного устройства в зависимости от ваших потребностей.
Схема
На следующей схеме показаны связи между различными модулями, участвующими в написании и использовании подключаемого модуля расширения. В частности, он отслеживает подключение от приложения к подключаемой библиотеке DLL, вплоть до драйвера и, наконец, до единицы расширения на самом устройстве. Схема также иллюстрирует различные идентификаторы GUID; идентичные значения выделяются с помощью соответствующего цвета.
Механизмы обработки событий
Класс USB Video поддерживает события автоматического обновления, когда устройство уведомляет драйвер узла об изменениях в любом из своих элементов управления. Драйвер Microsoft USB Video Class поддерживает эту концепцию, позволяя приложениям регистрировать события автоматического обновления. Процесс получения обновлений состоит из трех этапов:
Регистрация для событий обновления с помощью KSEVENTSETID_VIDCAPNotify::KSEVENT_VIDCAP_AUTO_UPDATE
Прослушивание событий в дескрипторове событий уведомления
Отмена уведомления по завершении