属性页插件

可以通过将属性页作为插件编写到 KS 代理中,为设备属性提供用户界面。 本主题介绍如何编写此类插件。 首先,按照 注册 KS 代理插件中所述的方法注册对象。

接下来,为筛选器声明工厂模板。 工厂模板是一个C++类,其中包含类工厂的信息。

在 DLL 中,声明 CFactoryTemplate对象的全局数组,其中一个对象用于 DLL 中的每个筛选器或 COM 组件。 如果只有一个属性页,请在数组中创建一个对象。

对于每个对象,为类标识符(CLSID)生成 GUID,并在声明中提供一个条目。

数组必须命名为 g_Templates。

CFactoryTemplate g_Templates[] =
{
    {
        L"My Property Page",
        &CLSID_MyPropPage),
        CMyPropPage::CreateInstance,
        NULL,
        NULL
    },
};

属性页应派生自 CBasePropertyPage 类,并应重写 CBasePropertyPage 的多个方法:

class CMyPropPage: public CBasePropertyPage
{
public:
    // creation routine returns ptr to new prop pg as a CUnknown
    static CUnknown* CreateInstance( LPUNKNOWN piOuterUnknown, HRESULT* phResult );

    // overridden methods:
    HRESULT OnConnect( IUnknown *punk);
    HRESULT OnDisconnect();
    HRESULT OnApplyChanges();
    HRESULT OnActivate();
    HRESULT OnDeactivate();
    INT_PTR OnReceiveMessage( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
private:
    CMyPropPage ( LPUNKNOWN piOuterUnknown );
};

若要初始化属性页,宿主属性表调用 IPropertyPage::SetPageSite。 此调用会导致调用插件的 OnConnect 方法。 在此调用时,属性页已连接到筛选器,但尚未显示属性页。

调用 OnConnect 时提供的参数是 KS 代理的接口,然后可以查询指向 IKsPropertySet 的指针。 然后,可以调用 IKsPropertySet::GetIKsPropertySet::Set 来操作驱动程序的公开的属性。

还必须提供 CreateInstance 方法。 系统调用属性页的方法来创建属性页的实例。 此方法应调用类的构造函数来实例化它。

构造函数接收指向外部未知接口的指针,在本例中为 KS 代理。

当属性页应释放关联的对象时,将调用属性页的 OnDisconnect 方法。 此回调应通过调用其 Release 方法来递减指向 KS 代理的接口指针的引用计数。