Generadores de clases y plantillas de fábrica
[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.
En este tema se describe cómo implementar un archivo DLL para un filtro DirectShow mediante las clases base de DirectShow.
Antes de que un cliente cree una instancia de un objeto COM, crea una instancia del generador de clases del objeto mediante una llamada a la función CoGetClassObject . A continuación, el cliente llama al método IClassFactory::CreateInstance del generador de clases. Es el generador de clases que realmente crea el componente y devuelve un puntero a la interfaz solicitada. (La función CoCreateInstance combina estos pasos, dentro de la llamada de función).
En la ilustración siguiente se muestra la secuencia de llamadas de método.
CoGetClassObject llama a la función DllGetClassObject , que se define en el archivo DLL. Esta función crea el generador de clases y devuelve un puntero a una interfaz en el generador de clases. DirectShow implementa DllGetClassObject para usted, pero la función se basa en el código de una manera específica. Para comprender cómo funciona, debe comprender cómo DirectShow implementa factorías de clases.
Un generador de clases es un objeto COM dedicado a crear otro objeto COM. Cada generador de clases tiene un tipo de objeto que crea. En DirectShow, cada generador de clases es una instancia de la misma clase de C++, CClassFactory. Las factorías de clase se especializan mediante otra clase, CFactoryTemplate, también denominada plantilla de fábrica. Cada generador de clases contiene un puntero a una plantilla de fábrica. La plantilla de fábrica contiene información sobre un componente específico, como el identificador de clase (CLSID) del componente y un puntero a una función que crea el componente.
El archivo DLL declara una matriz global de plantillas de fábrica, una para cada componente del archivo DLL. Cuando DllGetClassObject crea un nuevo generador de clases, busca en la matriz una plantilla con un CLSID coincidente. Suponiendo que encuentra una, crea un generador de clases que contiene un puntero a la plantilla coincidente. Cuando el cliente llama a IClassFactory::CreateInstance, el generador de clases llama a la función de creación de instancias definida en la plantilla.
En la ilustración siguiente se muestra la secuencia de llamadas de método.
La ventaja de esta arquitectura es que puede definir solo algunas cosas específicas de su componente, como la función de creación de instancias, sin implementar toda la fábrica de clases.
Temas relacionados