Partager via


Distributeurs de plug-ins

[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngineet audio/vidéo capture dans Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement que le nouveau code utilise MediaPlayer, IMFMediaEngine et 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) permettent d’étendre les fonctionnalités du gestionnaire de graphiques de filtre. Un serveur de distribution de plug-ins est un objet COM que le gestionnaire de graphiques de filtre agrège au moment de l’exécution. Les applications obtiennent l’accès au PID via le gestionnaire de graphiques de filtre.

Lorsque le gestionnaire de graphiques de filtre est interrogé pour une interface qu’il ne prend pas en charge, il recherche dans le Registre une clé avec le formulaire 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 graphiques de filtre agrège le PID et retourne un pointeur d’interface, agissant ainsi comme IUnknown 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 de externe IUnknown pour les interfaces sur le gestionnaire de graphiques de filtre. En appelant la méthode IFilterGraph ::EnumFilters, le PID peut énumérer les filtres dans le graphe 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 des filtres.

Lorsque le gestionnaire de graphiques 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 graphiques de filtre l’utilise pour informer le PID des modifications apportées au graphique :

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 graphiques de filtre 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 graphiques de filtre, il doit les libérer immédiatement. Sinon, il peut créer un nombre de références circulaires, ce qui peut empêcher le gestionnaire de graphiques de filtre d’être détruit. La conservation d’un nombre de références sur le gestionnaire de graphiques 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 graphiques de filtre, vous pouvez appliquer cela dans la méthode de constructeur de l’ID. Vérifiez si le pointeur IUnknown externe est NULL et, le cas échéant, retournez le code d’erreur VFW_E_NEED_OWNER. (Consultez 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’interfaceIGraphBuilder. Retourne un code d’erreur si l’objet n’expose pas IGraphBuilder.