属性页插件

可以通过编写属性页作为 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 代理接口的指针上的引用计数。