注册 DMO

[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 MediaPlayerIMFMediaEngine音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]

为了使客户端能够使用 DMO,必须在用户的系统上注册 CLSID。 这是通过 DLL 的 DllRegisterServer 函数完成的。 如果使用活动模板库 (ATL) ,ATL 向导将自动生成此函数。

还可以在一个或多个标准 DMO 类别下注册 DMO。 这使客户端可以使用 DMOEnum 函数发现 DMO 。 类别由 GUID 定义,并在 DMO GUID 部分列出。

在类别下注册 DMO 是可选的。 为此,请调用 DMORegister 函数并指定 DMO、CLSID 和类别的友好名称。 (可选)还可以注册一组 DSO 支持的媒体类型。 有关详细信息,请参阅 DMO 媒体类型

以下示例演示如何注册支持 PCM 音频输入和输出的音频效果 DMO。 在这种情况下,输入类型和输出类型相同。

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 函数创建的任何注册表项。 如果在注册 DMO 时调用 DMORegister,则注销 DMO 时必须具有同一类别的 DMOUnregister。

以下示例删除在上一示例中创建的注册表项:

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

DirectShow 优点值

为了生成筛选器图,DirectShow 会向 D 莫分配默认优点值。 可以通过在 HKEY_CLASSES_ROOT\CLSID 中向 DMO 的注册表项添加注册表项来替代此值。 包括名为 MeritDWORD 值,其值指定优点。

编写 DMO