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, IMFMediaEnginey captura de audio y 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 captura de audio y vídeo 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ónCoCreateInstance combina estos pasos, dentro de la llamada de función).
En la ilustración siguiente se muestra la secuencia de llamadas de método.
de generador de clases
CoGetClassObject llama a la funciónDllGetClassObject, 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 automáticamente, 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. Los generadores de clases se especializan por medio de otra clase, CFactoryTemplate, también denominado plantilla de fábrica de . 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 realiza una nueva fábrica de clases, busca la matriz de una plantilla con un CLSID coincidente. Suponiendo que encuentre uno, 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.
dll
La ventaja de esta arquitectura es que puede definir solo algunas cosas específicas del componente, como la función de creación de instancias, sin implementar toda la factoría de clases.
Temas relacionados