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