在现代软件开发中,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()
要为ATLCOM对象添加PersistXML支持,需要做以下几步:
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类型。