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