WEB开发网
开发学院软件开发VC COM组件设计与应用(十八)——属性包 阅读

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 !

上一页  1 2 3 4 5  下一页

Tags:COM 组件 设计

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接