Share via


Implementando DllRegisterServer

[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Audio/Video Capture in 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.]

A etapa final é implementar a função DllRegisterServer . A DLL que contém o componente deve exportar essa função. A função será chamada por um aplicativo de configuração ou quando o usuário executar a ferramenta Regsvr32.exe.

O exemplo a seguir mostra uma implementação mínima de DlLRegisterServer:

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

A função AMovieDllRegisterServer2 cria entradas do Registro para cada componente no

g_Templates

matriz. No entanto, essa função tem algumas limitações. Primeiro, ele atribui todos os filtros à categoria "Filtros do DirectShow" (CLSID_LegacyAmFilterCategory), mas nem todos os filtros pertencem a essa categoria. Filtros de captura e filtros de compactação, por exemplo, têm suas próprias categorias. Em segundo lugar, se o filtro der suporte a um dispositivo de hardware, talvez seja necessário registrar duas informações adicionais que AMovieDLLRegisterServer2 não manipula: a média e a categoria de pino. Um meio define um método de comunicação em um dispositivo de hardware, como um barramento. A categoria de pino define a função de um pino. Para obter informações sobre meios, confira "KSPIN_MEDIUM" no DDK (Microsoft Windows Driver Development Kit). Para obter uma lista de categorias de pino, consulte Fixar Conjunto de Propriedades.

Se você quiser especificar uma categoria de filtro, uma categoria de pino ou média, chame o método IFilterMapper2::RegisterFilter de dentro de DllRegisterServer. Esse método usa um ponteiro para uma estrutura REGFILTER2 , que especifica informações sobre o filtro.

Para complicar um pouco as coisas, a estrutura REGFILTER2 dá suporte a dois formatos diferentes para registrar pinos. O membro dwVersion especifica o formato:

  • Se dwVersion for 1, o formato de pino será AMOVIESETUP_PIN (descrito anteriormente).
  • Se dwVersion for 2, o formato de pino será REGFILTERPINS2.

A estrutura REGFILTERPINS2 inclui entradas para médias de pino e categorias de pino. Além disso, ele usa sinalizadores de bits para alguns itens que AMOVIESETUP_PIN declara como valores boolianos.

O exemplo a seguir mostra como chamar IFilterMapper2::RegisterFilter de dentro de DllRegisterServer:

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