Реализация DllRegisterServer

[Функция, связанная с этой страницей, DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngineи аудио и видеозахват в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует, чтобы новый код по возможности использовал MediaPlayer, IMFMediaEngine и захват аудио и видео в Media Foundation вместо DirectShow. Корпорация Майкрософт предлагает, что существующий код, использующий устаревшие API, будет перезаписан для использования новых API, если это возможно.]

Последним шагом является реализация функции DllRegisterServer. Библиотека DLL, содержащая компонент, должна экспортировать эту функцию. Функция будет вызываться приложением настройки или когда пользователь запускает средство Regsvr32.exe.

В следующем примере показана минимальная реализация DlLRegisterServer:

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

Функция AMovieDllRegisterServer2 создаёт записи реестра для каждого компонента.

g_Templates

массив. Однако эта функция имеет некоторые ограничения. Во-первых, он назначает каждый фильтр категории "Фильтры DirectShow" (CLSID_LegacyAmFilterCategory), но не каждый фильтр принадлежит этой категории. Например, фильтры захвата и фильтры сжатия имеют собственные категории. Во-вторых, если фильтр поддерживает аппаратное устройство, может потребоваться зарегистрировать два дополнительных фрагмента информации, которые AMovieDLLRegisterServer2 не обрабатываются: среда и категория контакта . Среда определяет метод связи на аппаратном устройстве, например шину. Категория контакта определяет его функцию. Сведения о средних средах см. в разделе "KSPIN_MEDIUM" в пакете средств разработки драйверов Microsoft Windows (DDK). Список категорий пинов см. в разделе Набор свойств пина.

Если вы хотите указать категорию фильтра, среду или категорию пинов, вызовите метод IFilterMapper2::RegisterFilter из DllRegisterServer. Этот метод принимает указатель на структуру REGFILTER2, которая указывает сведения о фильтре.

Для некоторого усложнения ситуации, структура REGFILTER2 поддерживает два разных формата для регистрации пинов. Элемент dwVersion указывает формат:

  • Если dwVersion равно 1, формат пина AMOVIESETUP_PIN (описан ранее).
  • Если dwVersion равно 2, то формат пинов REGFILTERPINS2.

Структура REGFILTERPINS2 включает записи для сред разъемов и категорий разъемов. Кроме того, он использует битовые флаги для некоторых элементов, которые AMOVIESETUP_PIN объявляет как булевые значения.

В следующем примере показано, как вызвать IFilterMapper2::RegisterFilter из 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;
}