Factoryvorlagenarray
[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.]
Die Factoryvorlage enthält die folgenden öffentlichen Membervariablen:
const WCHAR * m_Name; // Name
const CLSID * m_ClsID; // CLSID
LPFNNewCOMObject m_lpfnNew; // Function to create an instance
// of the component
LPFNInitRoutine m_lpfnInit; // Initialization function (optional)
const AMOVIESETUP_FILTER * m_pAMovieSetup_Filter; // Set-up information (for filters)
Die beiden Funktionszeiger m_lpfnNew und m_lpfnInit verwenden die folgenden Typdefinitionen:
typedef CUnknown *(CALLBACK *LPFNNewCOMObject)(LPUNKNOWN pUnkOuter, HRESULT *phr);
typedef void (CALLBACK *LPFNInitRoutine)(BOOL bLoading, const CLSID *rclsid);
Die erste ist die Instanziierungsfunktion für die Komponente. Die zweite ist eine optionale Initialisierungsfunktion. Wenn Sie eine Initialisierungsfunktion bereitstellen, wird sie innerhalb der DLL-Einstiegspunktfunktion aufgerufen. (Die DLL-Einstiegspunktfunktion wird weiter unten in diesem Artikel erläutert.)
Angenommen, Sie erstellen eine DLL, die eine Komponente namens CMyComponent enthält, die von CUnknown erbt. Sie müssen die folgenden Elemente in Ihrer DLL angeben:
- Die Initialisierungsfunktion, eine öffentliche Methode, die eine neue instance von CMyComponent zurückgibt.
- Ein globales Array von Factoryvorlagen mit dem Namen g_Templates. Dieses Array enthält die Factoryvorlage für CMyComponent.
- Eine globale Variable namens g_cTemplates , die die Größe des Arrays angibt.
Im folgenden Beispiel wird gezeigt, wie diese Elemente deklariert werden:
// Public method that returns a new instance.
CUnknown * WINAPI CMyComponent::CreateInstance(LPUNKNOWN pUnk, HRESULT *pHr)
{
CMyComponent *pNewObject = new CMyComponent(NAME("My Component"), pUnk, pHr );
if (pNewObject == NULL) {
*pHr = E_OUTOFMEMORY;
}
return pNewObject;
}
CFactoryTemplate g_Templates[1] =
{
{
L"My Component", // Name
&CLSID_MyComponent, // CLSID
CMyComponent::CreateInstance, // Method to create an instance of MyComponent
NULL, // Initialization function
NULL // Set-up information (for filters)
}
};
int g_cTemplates = sizeof(g_Templates) / sizeof(g_Templates[0]);
Die CreateInstance
-Methode ruft den Klassenkonstruktor auf und gibt einen Zeiger auf die neue Klasse instance zurück. Der Parameter pUnk ist ein Zeiger auf das Aggregieren von IUnknown. Sie können diesen Parameter einfach an den Klassenkonstruktor übergeben. Der Parameter pHr ist ein Zeiger auf einen HRESULT-Wert. Der Klassenkonstruktor legt dies auf einen geeigneten Wert fest, aber wenn der Konstruktor fehlschlägt, legen Sie den Wert auf E_OUTOFMEMORY fest.
Das NAME-Makro generiert eine Zeichenfolge in Debugbuilds, löst jedoch in Verkaufsbuilds in NULL auf. Es wird in diesem Beispiel verwendet, um der Komponente einen Namen zu geben, der in Debugprotokollen angezeigt wird, aber in der endgültigen Version keinen Arbeitsspeicher belegt.
Die CreateInstance
-Methode kann einen beliebigen Namen haben, da sich die Klassenfactory auf den Funktionszeiger in der Factoryvorlage bezieht.
G_Templates und g_cTemplates sind jedoch globale Variablen, die von der Klassenfactory erwartet werden, sodass sie genau diese Namen aufweisen müssen.
Zugehörige Themen