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


Регистрация DMO

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

Чтобы клиенты использовали DMO, идентификатор CLSID должен быть зарегистрирован в системе пользователя. Это делается с помощью функции DLL DllRegisterServer . Если вы используете библиотеку активных шаблонов (ATL), мастер ATL автоматически создаст эту функцию.

Вы также можете зарегистрировать DMO в одной или нескольких стандартных категориях DMO. Это позволяет клиентам обнаруживать DMO с помощью функции DMOEnum . Категории определяются с помощью GUID и перечислены в разделе Идентификаторы GUID DMO.

Регистрация объекта DMO в категории необязательна. Для этого вызовите функцию DMORegister и укажите понятное имя объекта DMO, ИДЕНТИФИКАТОР CLSID и категорию. При необходимости можно также зарегистрировать набор типов мультимедиа, поддерживаемых вашими МДО. Дополнительные сведения см. в разделе Типы мультимедиа DMO.

В следующем примере показано, как зарегистрировать объект DMO звукового эффекта, поддерживающий вход и вывод звука PCM. В этом случае типы входных и выходных данных совпадают.

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

В этом примере предполагается, что для создания проекта использовалась ATL; последняя строка функции вызывает стандартный метод ATL для регистрации COM-сервера. Если вы не используете ATL, функция будет выглядеть иначе.

Отмена регистрации DMO

Функция DllUnregisterServer должна удалить все записи реестра, создаваемые функцией DllRegisterServer . Если вы вызываете DMORegister при регистрации объекта DMO, при отмене регистрации DMO необходимо выполнить регистрацию DMOUnister с той же категорией.

В следующем примере удаляются записи реестра, созданные в предыдущем примере:

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

Значения заслуг DirectShow

Для создания графов фильтров DirectShow присваивает ему значение по умолчанию. Это значение можно переопределить, добавив запись реестра в раздел реестра DMO в HKEY_CLASSES_ROOT\CLSID. Включите значение DWORD с именем Merit , значение которого указывает достоинства.

Создание DMO