Поделиться через


Реализация 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;
}