COM组件设计与应用(十八)——属性包
2006-07-22 22:55:21 来源:WEB开发网核心提示: (4)添加 IPersistPropertyBag 接口还记得我们在上回书中如何添加 IPersistStreamInit 的吗?添加 IPersistPropertyBag 的方法也一样,但这次我们换一个方式,COM组件设计与应用(十八)——属性包(4),即我们不从 IPersistPr
(4)添加 IPersistPropertyBag 接口
还记得我们在上回书中如何添加 IPersistStreamInit 的吗?添加 IPersistPropertyBag 的方法也一样,但这次我们换一个方式,即我们不从 IPersistPropertyBag 派生,而是从 IPersistPropertyBagImpl<> 派生。在 ATL 中,系统帮我们已经完成了很多接口的默认实现,我们只要从 IxxxImpl<> 派生,然后再添加一些必要的映射和变量,就可以了。这样显然要比自己去实现接口的所有函数要简单许多了。其实,如果你明白了本回 IPersistPropertyBagImpl<> 派生的方法后,你完全可以修改前回书中的实现方法,从 IPersistStreamInit 派生改进为从 IPersistStreamInitImpl<> 派生。
class ATL_NO_VTABLE Cxxx :
public CComObjectRootEx<...>,
public CComCoClass<...>,
public IDispatchImpl<...>,
public IPersistPropertyBagImpl<Cxxx> // 手工添加派生类
{
... ... ...
BEGIN_COM_MAP(Cxxx)
... ... ...
COM_INTERFACE_ENTRY(IPersistPropertyBag) // 手工添加接口表
END_COM_MAP()
... ... ...
// 手工添加属性映射表,这是 IPersistXXXImpl 所必须的。
// 将来你在写 ActiveX 的时候,ATL 向导会帮我们添加属性映射表
BEGIN_PROP_MAP(Cxxx)
// 参数:"属性名称", 接口属性序号(见IDL文件), 属性页对话窗
PROP_ENTRY("str", 1, CLSID_NULL)
PROP_ENTRY("integer", 2, CLSID_NULL)
END_PROP_MAP()
... ... ...
public:
... ... ...
// 这个成员变量,是 IPersistXXXImpl 所必须的
bool m_bRequiresSave; // 表示属性数据是否已经改变而需要保存
};
我们只要手工添加以上内容,而不用自己写任何 IPersistPropertyBag 接口的函数,多简单呀!天空出彩霞呀,地上开红花呀......会唱这只歌的同学请举手,每个人奖励 vckbase 的专家分 500 !
更多精彩
赞助商链接