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


Фабрики классов и шаблоны фабрик

[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать в новом коде MediaPlayer, IMFMediaEngine и аудио/видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, в котором используются устаревшие API, чтобы по возможности использовать новые API.]

В этом разделе описывается реализация библиотеки DLL для фильтра DirectShow с помощью базовых классов DirectShow.

Прежде чем клиент создаст экземпляр COM-объекта, он создает экземпляр фабрики класса объекта с помощью вызова функции CoGetClassObject . Затем клиент вызывает метод IClassFactory::CreateInstance фабрики класса. Именно фабрика класса фактически создает компонент и возвращает указатель на запрошенный интерфейс. (Функция CoCreateInstance объединяет эти шаги в вызове функции.)

На следующем рисунке показана последовательность вызовов методов.

вызовы метода для создания фабрики классов

CoGetClassObject вызывает функцию DllGetClassObject , определенную в библиотеке DLL. Эта функция создает фабрику классов и возвращает указатель на интерфейс фабрики классов. DirectShow реализует DllGetClassObject , но функция использует ваш код определенным образом. Чтобы понять, как это работает, необходимо понять, как DirectShow реализует фабрики классов.

Фабрика класса — это COM-объект, предназначенный для создания другого COM-объекта. Каждая фабрика классов имеет один тип создаваемого объекта. В DirectShow каждая фабрика классов является экземпляром одного класса C++ CClassFactory. Фабрики классов специализированы с помощью другого класса , CFactoryTemplate, который также называется шаблоном фабрики. Каждая фабрика класса содержит указатель на шаблон фабрики. Шаблон фабрики содержит сведения о конкретном компоненте, например идентификатор класса компонента (CLSID) и указатель на функцию, создающую компонент.

Библиотека DLL объявляет глобальный массив шаблонов фабрики, по одному для каждого компонента в библиотеке DLL. Когда DllGetClassObject создает новую фабрику классов, он ищет в массиве шаблон с соответствующим идентификатором CLSID. При условии, что он находит его, он создает фабрику классов, содержащую указатель на соответствующий шаблон. Когда клиент вызывает IClassFactory::CreateInstance, фабрика класса вызывает функцию создания экземпляра, определенную в шаблоне.

На следующем рисунке показана последовательность вызовов методов.

шаблоны фабрики классов в библиотеке DLL

Преимущество этой архитектуры заключается в том, что вы можете определить только несколько вещей, относящихся к компоненту, например функцию создания экземпляров, без реализации всей фабрики классов.

Создание библиотеки DLL фильтра DirectShow