Registro de un DMO

[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.

Para que los clientes usen su DMO, el CLSID debe estar registrado en el sistema del usuario. Esto se realiza a través de la función DllRegisterServer del archivo DLL. Si usa la Biblioteca de plantillas activas (ATL), el asistente de ATL genera automáticamente esta función.

También puede registrar su DMO en una o varias categorías de DMO estándar. Esto permite a los clientes detectar su DMO mediante la función DMOEnum . Las categorías se definen mediante GUID y se enumeran en la sección GUID de DMO.

El registro de un DMO en una categoría es opcional. Para ello, llame a la función DMORegister y especifique el nombre descriptivo de DMO, clSID y la categoría. Opcionalmente, también puede registrar un conjunto de tipos de medios que admiten las DPO. Para obtener más información, vea Tipos de medios DMO.

En el ejemplo siguiente se muestra cómo registrar un DMO de efecto de audio que admite la entrada y salida de audio PCM. En este caso, los tipos de entrada y los tipos de salida son los mismos.

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);
}

En este ejemplo se supone que se usó ATL para crear el proyecto; la última línea de la función llama al método ATL estándar para registrar el servidor COM. Si no usa ATL, la función tendrá un aspecto diferente.

Anulación del registro de un DMO

La función DllUnregisterServer debe quitar las entradas del Registro que cree la función DllRegisterServer . Si llama a DMORegister al registrar el DMO, debe DMOUnregister con la misma categoría al anular el registro de DMO.

En el ejemplo siguiente se quitan las entradas del Registro creadas en el ejemplo anterior:

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

DirectShow Merit Values

Para crear gráficos de filtros, DirectShow asigna un valor de mérito predeterminado a las DPO. Para invalidar este valor, agregue una entrada del Registro a la clave del Registro de DMO en HKEY_CLASSES_ROOT\CLSID. Incluya un valor DWORD denominado Merit cuyo valor especifica el mérito.

Escritura de un DMO