Partilhar via


Registrando um DMO

[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEnginee Audio/Video Capture in Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda vivamente que o novo código utilize MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo no Media Foundation em vez de DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]

Para que os clientes possam usar seu DMO, o CLSID deve ser registrado no sistema do usuário. Isso é feito através da função DllRegisterServer da DLL. Se você estiver usando a ATL (Ative Template Library), o assistente da ATL gerará automaticamente essa função.

Você também pode registrar seu DMO em uma ou mais categorias padrão de DMO. Isso permite que os clientes descubram seu DMO usando a função DMOEnum. As categorias são definidas por GUID e estão listadas na seção GUIDs DMO.

Registrar um DMO em uma categoria é opcional. Para fazer isso, chame a função DMORegister e especifique o nome amigável do DMO, o CLSID e a categoria. Opcionalmente, você também pode registrar um conjunto de tipos de mídia suportados por seus DMOs. Para obter mais informações, consulte Tipos de mídia DMO.

O exemplo a seguir mostra como registar um efeito de áudio DMO que suporta entrada e saída de áudio PCM. Neste caso, os tipos de entrada e saída são os mesmos.

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

Este exemplo pressupõe que a ATL foi usada para criar o projeto; a última linha da função chama o método ATL padrão para registrar o servidor COM. Se não estiver a utilizar ATL, a sua função terá um aspeto diferente.

Anular o registo de um DMO

Sua função DllUnregisterServer deve remover todas as entradas do Registro que a função DllRegisterServer cria. Se chamar DMORegister ao registar o DMO, deve DMOUnregister com a mesma categoria ao desregistar o DMO.

O exemplo a seguir remove as entradas do Registro criadas no exemplo anterior:

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

Valores de Mérito do DirectShow

Para efeitos de criação de gráficos de filtros, o DirectShow atribui um valor de mérito padrão aos DMOs. Você pode substituir esse valor adicionando uma entrada do Registro à chave do Registro do DMO no HKEY_CLASSES_ROOT\CLSID. Inclua um valor DWORD chamado Merit cujo valor especifica o mérito.

Escrevendo um DMO