Registrieren einer DMO

[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.]

Damit Clients Ihre DMO verwenden können, muss die CLSID im System des Benutzers registriert sein. Dies erfolgt über die DllRegisterServer-Funktion der DLL. Wenn Sie die Active Template Library (ATL) verwenden, generiert der ATL-Assistent diese Funktion automatisch.

Sie können Ihre DMO auch unter einer oder mehreren DMO-Standardkategorien registrieren. Dadurch können Clients Ihre DMO mithilfe der DMOEnum-Funktion ermitteln. Die Kategorien werden durch GUID definiert und im Abschnitt DMO-GUIDs aufgeführt.

Die Registrierung einer DMO unter einer Kategorie ist optional. Rufen Sie hierzu die DMORegister-Funktion auf, und geben Sie den Anzeigenamen des DMO, der CLSID und der Kategorie an. Optional können Sie auch eine Reihe von Medientypen registrieren, die von Ihren DMOs unterstützt werden. Weitere Informationen finden Sie unter DMO-Medientypen.

Das folgende Beispiel zeigt, wie Sie einen Audioeffekt-DMO registrieren, der PCM-Audioeingabe und -ausgabe unterstützt. In diesem Fall sind die Eingabe- und Ausgabetypen identisch.

STDAPI DllRegisterServer(void)
{
    // Register the DMO as a PCM audio effect DMO
    DMO_PARTIAL_MEDIATYPE mt;
    mt.type    = MEDIATYPE_Audio;
    mt.subtype = MEDIASUBTYPE_PCM;
    HRESULT hr = DMORegister(
        L"MyDMO",                  // Friendly name
        CLSID_MyDMO,               // CLSID
        DMOCATEGORY_AUDIO_EFFECT,  // Category
        0,                         // Flags 
        1,                         // Number of input types
        &mt,                       // Array of input types
        1,                         // Number of output types
        &mt);                      // Array of output types

    if (FAILED(hr)) return hr;

    // Registers the object, with no typelib.
    return _Module.RegisterServer(FALSE);
}

In diesem Beispiel wird davon ausgegangen, dass ATL zum Erstellen des Projekts verwendet wurde. die letzte Zeile der Funktion ruft die ATL-Standardmethode auf, um den COM-Server zu registrieren. Wenn Sie ATL nicht verwenden, sieht Ihre Funktion anders aus.

Aufheben der Registrierung einer DMO

Ihre DllUnregisterServer-Funktion muss alle Registrierungseinträge entfernen, die die DllRegisterServer-Funktion erstellt. Wenn Sie DMORegister aufrufen, wenn Sie die DMO registrieren, müssen Sie DMOUnregister mit derselben Kategorie verwenden, wenn Sie die Registrierung von DMO aufheben.

Im folgenden Beispiel werden die Registrierungseinträge entfernt, die im vorherigen Beispiel erstellt wurden:

STDAPI DllUnregisterServer(void)
{
    DMOUnregister(CLSID_MyDMO, DMOCATEGORY_AUDIO_EFFECT);
    return _Module.UnregisterServer(TRUE);
}

DirectShow Merit-Werte

Zum Erstellen von Filterdiagrammen weist DirectShow DMOs einen Standardwert zu. Sie können diesen Wert überschreiben, indem Sie dem Registrierungsschlüssel des DMO in HKEY_CLASSES_ROOT\CLSID einen Registrierungseintrag hinzufügen. Schließen Sie einen DWORD-Wert mit dem Namen Merit ein, dessen Wert den Wert angibt.

Schreiben einer DMO