Freigeben über


Klassenfabriken und Factoryvorlagen

[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde durch MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation ersetzt. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code nach Möglichkeit MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet. Microsoft schlägt vor, vorhandenen Code, der die Legacy-APIs verwendet, um nach Möglichkeit die neuen APIs zu verwenden.]

In diesem Thema wird beschrieben, wie Sie mithilfe der DirectShow-Basisklassen eine DLL für einen DirectShow-Filter implementieren.

Bevor ein Client eine instance eines COM-Objekts erstellt, erstellt er mithilfe eines Aufrufs der CoGetClassObject-Funktion eine instance der Klassenfactory des Objekts. Der Client ruft dann die IClassFactory::CreateInstance-Methode der Klassenfactory auf. Es ist die Klassenfactory, die die Komponente tatsächlich erstellt und einen Zeiger auf die angeforderte Schnittstelle zurückgibt. (Die CoCreateInstance-Funktion kombiniert diese Schritte innerhalb des Funktionsaufrufs.)

Die folgende Abbildung zeigt die Reihenfolge der Methodenaufrufe.

Methodenaufrufe zum Erstellen einer Klassenfactory

CoGetClassObject ruft die DllGetClassObject-Funktion auf, die in der DLL definiert ist. Diese Funktion erstellt die Klassenfactory und gibt einen Zeiger auf eine Schnittstelle in der Klassenfactory zurück. DirectShow implementiert DllGetClassObject für Sie, aber die Funktion basiert auf bestimmte Weise auf Ihren Code. Um zu verstehen, wie es funktioniert, müssen Sie verstehen, wie DirectShow Klassenfabriken implementiert.

Eine Klassenfactory ist ein COM-Objekt, das zum Erstellen eines weiteren COM-Objekts bestimmt ist. Jede Klassenfactory verfügt über einen Objekttyp, den sie erstellt. In DirectShow ist jede Klassenfactory eine instance derselben C++-Klasse, CClassFactory. Klassenfabriken werden mithilfe einer anderen Klasse, CFactoryTemplate, auch als Factoryvorlage bezeichnet, spezialisiert. Jede Klassenfactory enthält einen Zeiger auf eine Factoryvorlage. Die Factoryvorlage enthält Informationen zu einer bestimmten Komponente, z. B. den Klassenbezeichner (CLSID) der Komponente und einen Zeiger auf eine Funktion, die die Komponente erstellt.

Die DLL deklariert ein globales Array von Factoryvorlagen, eines für jede Komponente in der DLL. Wenn DllGetClassObject eine neue Klassenfactory erstellt, durchsucht es das Array nach einer Vorlage mit einer übereinstimmenden CLSID. Wenn eine gefunden wird, wird eine Klassenfactory erstellt, die einen Zeiger auf die übereinstimmende Vorlage enthält. Wenn der Client IClassFactory::CreateInstance aufruft, ruft die Klassenfactory die in der Vorlage definierte Instanziierungsfunktion auf.

Die folgende Abbildung zeigt die Reihenfolge der Methodenaufrufe.

Klassenfactoryvorlagen in einer DLL

Der Vorteil dieser Architektur besteht darin, dass Sie nur einige komponentenspezifische Elemente definieren können, z. B. die Instanziierungsfunktion, ohne die gesamte Klassenfactory zu implementieren.

Erstellen einer DirectShow-Filter-DLL