Distributeurs de plug-ins

[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.]

Les distributeurs de plug-ins (PID) sont un moyen d’étendre les fonctionnalités du gestionnaire de graphe de filtre. Un serveur de distribution de plug-in est un objet COM que le gestionnaire de graphe de filtre agrège au moment de l’exécution. Les applications obtiennent l’accès au PID via le gestionnaire de graphe de filtre.

Lorsque le gestionnaire de graphe de filtre est interrogé pour une interface qu’il ne prend pas en charge, il recherche dans le Registre une clé au format suivant :

HKEY_CLASSES_ROOT\Interface\IID\Distributor

IID est une chaîne contenant l’identificateur d’interface. Si l’entrée de Registre existe, la valeur de l’entrée définit l’identificateur de classe (CLSID) d’un PID qui prend en charge l’interface. Le gestionnaire de graphe de filtre agrège le PID et retourne un pointeur d’interface, agissant ainsi en tant que IUnknown externe pour le PID. Lorsque l’application appelle des méthodes sur l’interface, elle les appelle en fait sur le PID. Toutefois, l’existence du PID est transparente pour l’application.

Le terme serveur de distribution provient du fait qu’un PID peut interroger son pointeur IUnknown externe pour les interfaces sur le gestionnaire de graphe de filtre. En appelant la méthode IFilterGraph::EnumFilters , le PID peut énumérer les filtres dans le graphique et distribuer les appels de méthode à ces filtres. De cette façon, un PID peut servir de point de contrôle unique pour que l’application appelle des méthodes sur les filtres.

Lorsque le gestionnaire de graphe de filtre agrège un PID, il interroge le PID pour l’interface IDistributorNotify . Si le PID prend en charge cette interface, le gestionnaire de graphe de filtre l’utilise pour informer le PID des modifications apportées au graphe :

Pour implémenter un PID personnalisé, créez un objet COM qui prend en charge l’agrégation. Il doit prendre en charge une interface que le gestionnaire de graphe de filtres ne prend pas déjà en charge. Si vous le souhaitez, il peut prendre en charge l’interface IDistributorNotify .

Si le PID obtient des pointeurs d’interface à partir du gestionnaire de graphe de filtre, il doit les libérer immédiatement. Sinon, il peut créer un nombre de références circulaires, ce qui pourrait empêcher la destruction du gestionnaire de graphe de filtre. La conservation d’un nombre de références sur le gestionnaire de graphe de filtre n’est pas nécessaire dans tous les cas, car le gestionnaire de graphiques de filtre contrôle la durée de vie du PID.

Étant donné qu’un PID est conçu spécifiquement pour l’agrégation par le gestionnaire de graphe de filtre, vous pouvez l’appliquer dans la méthode du constructeur du PID. Vérifiez si le pointeur IUnknown externe a la valeur NULL et, si c’est le cas, retournez le code d’erreur VFW_E_NEED_OWNER. (Voir Codes d’erreur et de réussite.) En outre, pour empêcher d’autres objets d’agréger le PID, vous pouvez interroger le pointeur IUnknown externe pour l’interface IGraphBuilder . Retourne un code d’erreur si l’objet n’expose pas IGraphBuilder.