Fabriques de classes et modèles d’usine

[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement au nouveau code d’utiliser MediaPlayer, IMFMediaEngine et La capture audio/vidéo dans Media Foundation au lieu de DirectShow, lorsque cela est possible. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]

Cette rubrique explique comment implémenter une DLL pour un filtre DirectShow à l’aide des classes de base DirectShow.

Avant qu’un client ne crée une instance d’un objet COM, il crée une instance de la fabrique de classes de l’objet, à l’aide d’un appel à la fonction CoGetClassObject. Le client appelle ensuite la méthode IClassFactory::CreateInstance de la fabrique de classes. C’est la fabrique de classes qui crée le composant et retourne un pointeur vers l’interface demandée. (La fonction CoCreateInstance combine ces étapes, à l’intérieur de l’appel de fonction.)

L’illustration suivante montre la séquence d’appels de méthode.

appels de méthode pour créer une fabrique de classes

CoGetClassObject appelle la fonction DllGetClassObject , qui est définie dans la DLL. Cette fonction crée la fabrique de classes et retourne un pointeur vers une interface sur la fabrique de classe. DirectShow implémente DllGetClassObject pour vous, mais la fonction s’appuie sur votre code d’une manière spécifique. Pour comprendre son fonctionnement, vous devez comprendre comment DirectShow implémente des fabriques de classes.

Une fabrique de classes est un objet COM dédié à la création d’un autre objet COM. Chaque fabrique de classes a un type d’objet qu’elle crée. Dans DirectShow, chaque fabrique de classes est une instance de la même classe C++, CClassFactory. Les usines de classe sont spécialisées au moyen d’une autre classe, CFactoryTemplate, également appelée modèle d’usine. Chaque fabrique de classe contient un pointeur vers un modèle de fabrique. Le modèle de fabrique contient des informations sur un composant spécifique, comme l’identificateur de classe (CLSID) du composant et un pointeur vers une fonction qui crée le composant.

La DLL déclare un tableau global de modèles de fabrique, un pour chaque composant de la DLL. Lorsque DllGetClassObject crée une nouvelle fabrique de classes, il recherche dans le tableau un modèle avec un CLSID correspondant. En supposant qu’il en trouve un, il crée une fabrique de classes qui contient un pointeur vers le modèle correspondant. Lorsque le client appelle IClassFactory::CreateInstance, la fabrique de classes appelle la fonction d’instanciation définie dans le modèle.

L’illustration suivante montre la séquence d’appels de méthode.

modèles de fabrique de classes dans une dll

L’avantage de cette architecture est que vous pouvez définir seulement quelques éléments spécifiques à votre composant, comme la fonction d’instanciation, sans implémenter l’ensemble de la fabrique de classes.

Comment créer une DLL de filtre DirectShow