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


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

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

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

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

Регистрация DMO в категории является необязательной. Для этого вызовите функцию DMORegister и укажите понятное имя DMO, CLSID и категорию. При желании, можно также зарегистрировать набор типов носителей, которые поддерживаются вашими DMOs. Дополнительные сведения см. в типах носителей 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 необходимо DMOUnregister с той же категорией при отмене регистрации DMO.

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

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

Значения приоритета DirectShow

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

написание DMO