在ATL COM对象中添加PersistXML支持

在现代软件开发中,XML因其结构化和可扩展性被广泛应用于数据交换和配置管理。对于使用ATLCOM对象的开发者来说,能够将对象的状态持久化到XML格式是一种非常有用的功能。本文将介绍如何在现有的ATL COM对象中添加PersistXML支持。

接口设计

为了实现XML持久化支持,首先需要定义一个接口。由于Microsoft已经为Commerce Server 2002定义了IPersistXML接口,但该接口使用BSTR作为XML的输入输出,而不是更灵活的VARIANT类型,因此设计了自己的IPersistVarXML接口。这个接口支持VARIANT类型的XML输入输出,并且可以使用ISAXContentHandler进行XML输出。

[ object, uuid(B66873EC-BBFF-11D4-A802-112233445566), helpstring("IPersistVarXML Interface"), pointer_default(unique) ] interface IPersistVarXML : IUnknown { [propget, helpstring("property ElementName")] HRESULT ElementName([out, retval] BSTR* bstrElementName); HRESULT LoadXML([in] VARIANT varSource, [in, optional, defaultvalue(0L)] IUnknown * pAttributes); HRESULT SaveXML([in] VARIANT varSource); };

实现类

实现IPersistVarXML接口的类需要继承自IPersistVarXML和ISAXContentHandlerImpl。这个实现类大量使用了Microsoft MS XML SDK(版本3及以上),因此需要在机器上安装msxml3.dll或更高版本。

template <class T> class ATL_NO_VTABLE IPersistVarXMLImpl : public IPersistVarXML, public ISAXContentHandlerImpl<T> { // 实现代码... };

属性映射

如果类已经从IPerPropertyBrowsingImpl、IPersistPropertyBagImpl、IPersistStreamInitImpl和ISpecifyPropertyPagesImpl类派生,并且使用了BEGIN_PROP_MAP()宏,那么IPersistVarXMLImpl可以重用这个映射,不需要做额外的工作。

BEGIN_PROP_MAP(CMyClass) PROP_ENTRY_EX("Caption", DISPID_CAPTION, CLSID_MyClassPropPage2, IID_IMyDual1) END_PROP_MAP()

添加XML支持

要为ATLCOM对象添加PersistXML支持,需要做以下几步:

  • 在项目中添加IPersistVarXMLImpl.h和IPersistVarXMLImpl.cpp文件。
  • 使类从IPersistVarXMLImpl派生。
  • 修改COM映射,添加ISAXContentHandler和IPersistVarXML接口到对象。
  • 添加public成员变量m_bRequiresSave。
  • 添加和/或修改属性映射,只添加需要XML持久化的属性。
  • 添加XML上下文映射以处理额外的功能(例如动态对象的创建和保存,不支持标准数据类型等)。
BEGIN_COM_MAP(CSystemUser) COM_INTERFACE_ENTRY(ISystemUser) COM_INTERFACE_ENTRY(IDispatch) COM_INTERFACE_ENTRY(ISAXContentHandler) COM_INTERFACE_ENTRY(IPersistVarXML) END_COM_MAP()

使用

使用IPersistVarXML的LoadXML(varSource)和SaveXML(varDest)函数来保存和加载XML内容。varSource可以是所有支持的ISAXXMLReader::parse()的VARIANT类型,而varDest可以是所有支持的IMXWriter::output()的VARIANT类型。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485