步骤 10. 支持 COM 注册

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

剩余的最后一个任务是支持 COM 注册,以便属性框架可以创建属性页的新实例。 将另一个 CFactoryTemplate 条目添加到全局 g_Templates 数组,该数组用于注册 DLL 中的所有 COM 对象。 不要包含属性页的任何筛选器设置信息。

const AMOVIESETUP_FILTER FilterSetupData = 
{ 
    /* Not shown ... */
};

CFactoryTemplate g_Templates[] =
{   
    // This entry is for the filter.
    {
        wszName,
        &CLSID_GrayFilter,
        CGrayFilter::CreateInstance,
        NULL,
        &FilterSetupData 
    },
    // This entry is for the property page.
    { 
        L"Saturation Props",
        &CLSID_SaturationProp,
        CGrayProp::CreateInstance, 
        NULL, NULL
    }
};

如果声明 g_cTemplates 如以下代码所示,则它根据数组大小自动具有正确的值:

int g_cTemplates = sizeof(g_Templates)/sizeof(g_Templates[0]);

此外,将静态 CreateInstance 方法添加到属性页类。 可以根据需要命名方法,但签名必须与以下示例所示的签名匹配:

static CUnknown * WINAPI CreateInstance(LPUNKNOWN pUnk, HRESULT *pHr) 
{
    CGrayProp *pNewObject = new CGrayProp(pUnk);
    if (pNewObject == NULL) 
    {
        *pHr = E_OUTOFMEMORY;
    }
    return pNewObject;
} 

若要测试属性页,请注册 DLL,然后在 GraphEdit 中加载筛选器。 右键单击筛选器,然后选择“ 筛选器属性”。

创建筛选器属性页

如何创建 DirectShow 筛选器 DLL