Registrazione di un DMO

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation invece di DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

Affinché i client usino l'oggetto DMO, il CLSID deve essere registrato nel sistema dell'utente. Questa operazione viene eseguita tramite la funzione DllRegisterServer della DLL. Se si usa Active Template Library (ATL), la procedura guidata ATL genera automaticamente questa funzione.

È anche possibile registrare la DMO in una o più categorie DMO standard. In questo modo i client possono individuare il DMO usando la funzione DMOEnum . Le categorie sono definite dal GUID e sono elencate nella sezione GUID DMO.

La registrazione di un oggetto DMO in una categoria è facoltativa. A tale scopo, chiamare la funzione DMORegister e specificare il nome descrittivo di DMO, CLSID e la categoria. Facoltativamente, è anche possibile registrare un set di tipi di supporti supportati dalle DMO. Per altre informazioni, vedere Tipi di supporti DMO.

L'esempio seguente illustra come registrare un effetto audio DMO che supporta l'input e l'output audio PCM. In questo caso i tipi di input e i tipi di output sono gli stessi.

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 questo esempio si presuppone che ATL sia stato usato per creare il progetto; l'ultima riga della funzione chiama il metodo ATL standard per registrare il server COM. Se non si usa ATL, la funzione avrà un aspetto diverso.

Annullamento della registrazione di un DMO

La funzione DllUnregisterServer deve rimuovere tutte le voci del Registro di sistema create dalla funzione DllRegisterServer . Se si chiama DMORegister quando si registra DMO, è necessario registrare DMOUnregister con la stessa categoria quando si annulla la registrazione di DMO.

Nell'esempio seguente vengono rimosse le voci del Registro di sistema create nell'esempio precedente:

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

Valori di merito DirectShow

Ai fini della creazione di grafici di filtro, DirectShow assegna un valore di merito predefinito alle DMO. È possibile eseguire l'override di questo valore aggiungendo una voce del Registro di sistema alla chiave del Registro di sistema DMO in HKEY_CLASSES_ROOT\CLSID. Includere un valore DWORD denominato Merit il cui valore specifica il merito.

Scrittura di un DMO