属性页插件
可以通过编写属性页作为 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::Get 和 IKsPropertySet::Set 来操作驱动程序的公开属性。
还必须提供 CreateInstance 方法。 系统调用属性页的 方法来创建属性页的实例。 此方法应调用类的构造函数来实例化它。
构造函数接收指向外部未知接口的指针,在本例中为 KS 代理。
当属性页应释放关联的对象时,将调用属性页的 OnDisconnect 方法。 此回调应通过调用其 Release 方法递减指向 KS 代理接口的指针上的引用计数。