Фабрики классов и шаблоны фабрик
[Функция, связанная с этой страницей, 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, фабрика классов вызывает функцию создания экземпляров, определенную в шаблоне.
На следующем рисунке показана последовательность вызовов методов.
Шаблоны фабрики классов
Преимущество этой архитектуры заключается в том, что можно определить лишь несколько вещей, относящихся к компоненту, например функции создания экземпляров, без реализации всей фабрики классов.
Связанные разделы