Plug-In-Verteiler

[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde von MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation abgelöst. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code mediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet, wenn möglich. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, so umgeschrieben wird, dass nach Möglichkeit die neuen APIs verwendet werden.]

Plug-In-Verteiler (PIDs) sind eine Möglichkeit, die Funktionalität des Filtergraph-Managers zu erweitern. Ein Plug-In-Verteiler ist ein COM-Objekt, das vom Filtergraph-Manager zur Laufzeit aggregiert wird. Anwendungen erhalten über den Filtergraph-Manager Zugriff auf die PID.

Wenn der Filtergraph-Manager nach einer Schnittstelle abgefragt wird, die er nicht unterstützt, durchsucht er die Registrierung nach einem Schlüssel im folgenden Format:

HKEY_CLASSES_ROOT\Interface\IID\Distributor

IID ist eine Zeichenfolge, die den Schnittstellenbezeichner enthält. Wenn der Registrierungseintrag vorhanden ist, definiert der Wert des Eintrags den Klassenbezeichner (CLSID) einer PID, die die Schnittstelle unterstützt. Der Filterdiagramm-Manager aggregiert die PID und gibt einen Schnittstellenzeiger zurück, wodurch er als äußeres IUnknown für die PID fungiert. Wenn die Anwendung Methoden auf der Schnittstelle aufruft, ruft sie diese tatsächlich auf der PID auf. Das Vorhandensein der PID ist jedoch für die Anwendung transparent.

Der Begriff Verteiler stammt aus der Tatsache, dass eine PID ihren äußeren IUnknown-Zeiger nach Schnittstellen im Filtergraph-Manager abfragen kann. Durch Aufrufen der IFilterGraph::EnumFilters-Methode kann die PID die Filter im Graphen aufzählen und Methodenaufrufe an diese Filter verteilen. Auf diese Weise kann eine PID als einzelner Kontrollpunkt für die Anwendung dienen, um Methoden für Filter aufzurufen.

Wenn der Filtergraph-Manager eine PID aggregiert, fragt er die PID für die IDistributorNotify-Schnittstelle ab . Wenn die PID diese Schnittstelle unterstützt, wird sie vom Filtergraph-Manager verwendet, um die PID über Änderungen im Diagramm zu benachrichtigen:

Um eine benutzerdefinierte PID zu implementieren, erstellen Sie ein COM-Objekt, das die Aggregation unterstützt. Es muss eine Schnittstelle unterstützen, die der Filtergraph-Manager noch nicht unterstützt. Optional kann die IDistributorNotify-Schnittstelle unterstützt werden .

Wenn die PID Schnittstellenzeiger aus dem Filtergraph-Manager abruft, sollten diese sofort freigegeben werden. Andernfalls wird möglicherweise eine zirkuläre Verweisanzahl erstellt, die verhindern könnte, dass der Filtergraph-Manager zerstört wird. Das Halten einer Verweisanzahl für den Filtergraph-Manager ist in jedem Fall unnötig, da der Filtergraph-Manager die Lebensdauer der PID steuert.

Da eine PID speziell für die Aggregation durch den Filtergraph-Manager entwickelt wurde, können Sie dies in der Konstruktormethode der PID erzwingen. Überprüfen Sie, ob der äußere IUnknown-ZeigerNULL ist, und geben Sie den Fehlercode VFW_E_NEED_OWNER zurück. (Siehe Fehler- und Erfolgscodes.) Um zu verhindern, dass andere Objekte die PID aggregieren, können Sie den äußeren IUnknown-Zeiger für die IGraphBuilder-Schnittstelle abfragen. Gibt einen Fehlercode zurück, wenn das Objekt IGraphBuilder nicht verfügbar macht.