Factoryvorlagenarray
[Das dieser Seite zugeordnete Feature DirectShow-ist ein Legacyfeature. Es wurde von MediaPlayer, IMFMediaEngineund Audio/Video Capture in Media Foundationersetzt. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code MediaPlayer-, IMFMediaEngine und Audio-/Videoaufnahme in Media Foundation anstelle von DirectShow-verwendet, wenn möglich. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, um die neuen APIs zu verwenden, falls möglich umgeschrieben 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 mit dem Namen 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 Instanz 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 mit dem Namen g_cTemplates, die die Größe des Arrays angibt.
Das folgende Beispiel zeigt, wie sie diese Elemente deklarieren:
// 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 Klasseninstanz zurück. Der Parameter pUnk ist ein Zeiger auf das Aggregieren 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- Makros generiert eine Zeichenfolge in Debugbuilds, wird jedoch in Verkaufsbuilds in NULL- aufgelöst. Es wird in diesem Beispiel verwendet, um der Komponente einen Namen zu geben, der in Debugprotokollen angezeigt wird, aber keinen Arbeitsspeicher in der endgültigen Version belegt.
Die CreateInstance
-Methode kann einen beliebigen Namen aufweisen, da die Klassenfactory auf den Funktionszeiger in der Factoryvorlage verweist.
g_Templates und g_cTemplates sind jedoch globale Variablen, die von der Klassenfactory erwartet werden, sodass sie genau diese Namen haben müssen.
Verwandte Themen