Implementieren von DllRegisterServer

Der letzte Schritt besteht in der Implementierung der DllRegisterServer-Funktion. Die DLL, die die Komponente enthält, muss diese Funktion exportieren. Die Funktion wird von einer Einrichtungsanwendung aufgerufen, oder wenn der Benutzer das tool Regsvr32.exe.

Das folgende Beispiel zeigt eine minimale Implementierung von DlLRegisterServer:

STDAPI DllRegisterServer(void)
{
    return AMovieDllRegisterServer2(TRUE);
}

Die AMovieDllRegisterServer2-Funktion erstellt Registrierungseinträge für jede Komponente in der

g_Templates

Array. Für diese Funktion gelten jedoch einige Einschränkungen. Zunächst wird jeder Filter der Kategorie "DirectShow Filters" (CLSID LegacyAmFilterCategory) zugewiesen, aber nicht jeder Filter gehört _ zu dieser Kategorie. Erfassungsfilter und Komprimierungsfilter verfügen beispielsweise über eigene Kategorien. Zweitens: Wenn Ihr Filter ein Hardwaregerät unterstützt, müssen Sie möglicherweise zwei zusätzliche Informationen registrieren, die AMovieDLLRegisterServer2 nicht verarbeitet: das Medium und die Pinkategorie. Ein Medium definiert eine Kommunikationsmethode in einem Hardwaregerät, z. B. einem Bus. Die Pinkategorie definiert die Funktion einer Stecknadel. Informationen zu Medien finden Sie unter "KSPIN MEDIUM" im _ Microsoft Windows Driver Development Kit (DDK). Eine Liste der Pinkategorien finden Sie unter Pin-Eigenschaftensatz.

Wenn Sie eine Filterkategorie, ein Medium oder eine Stecknadelkategorie angeben möchten, rufen Sie die IFilterMapper2::RegisterFilter-Methode in DllRegisterServer auf. Diese Methode verwendet einen Zeiger auf eine REGFILTER2-Struktur, die Informationen zum Filter angibt.

Um etwas komplizierter zu werden, unterstützt die REGFILTER2-Struktur zwei verschiedene Formate für die Registrierung von Pins. Der dwVersion-Member gibt das Format an:

  • Wenn dwVersion 1 ist, ist das Pinformat AMOVIESETUP _ PIN (oben beschrieben).
  • Wenn dwVersion 2 ist, ist das Pinformat REGFILTERPINS2.

Die REGFILTERPINS2-Struktur enthält Einträge für Stecknadelmedium und Pinkategorien. Außerdem werden Bitflags für einige Elemente verwendet, die von AMOVIESETUP _ PIN als boolesche Werte deklariert werden.

Das folgende Beispiel zeigt, wie IFilterMapper2::RegisterFilter innerhalb von DllRegisterServer aufgerufen wird:

REGFILTER2 rf2FilterReg = {
    1,              // Version 1 (no pin mediums or pin category).
    MERIT_NORMAL,   // Merit.
    1,              // Number of pins.
    &sudPins        // Pointer to pin information.
};

STDAPI DllRegisterServer(void)
{
    HRESULT hr;
    IFilterMapper2 *pFM2 = NULL;

    hr = AMovieDllRegisterServer2(TRUE);
    if (FAILED(hr))
        return hr;

    hr = CoCreateInstance(CLSID_FilterMapper2, NULL, CLSCTX_INPROC_SERVER,
            IID_IFilterMapper2, (void **)&pFM2);

    if (FAILED(hr))
        return hr;

    hr = pFM2->RegisterFilter(
        CLSID_SomeFilter,                // Filter CLSID. 
        g_wszName,                       // Filter name.
        NULL,                            // Device moniker. 
        &CLSID_VideoCompressorCategory,  // Video compressor category.
        g_wszName,                       // Instance data.
        &rf2FilterReg                    // Pointer to filter information.
    );
    pFM2->Release();
    return hr;
}