问题来源
在微软的官方blog中对于msxml的版本进行一些说明,连微软自己也承认,目前的msxml版本太过于混乱了,以致于很难使用。
版本信息
MSXML是与浏览器或者Office相关的,大部分MSXML是与浏览器相关,只有MSXML5是主要为Office2003开发的,因此如果想要使用MSXML5.dll来作为浏览器的访问,并不被微软推荐,微软希望使用最近的MSXML6来操作XML,但是由于2001年,推出IE6.0(也就是XP上的,2k系统带的是IE5.0版本)时带的是MSXML3.dll版本,因此大部分系统都是支持MSXML3.DLL的。
哪个合理
目前的系统中,很多时候MSXML3.dll,MSXML4.DLL,MSXM5.DLL,MSXML6.DLL都是存在于系统中,编程中选择合理的XML版本,可以减少因为不同版本带来的差异形成问题的查找时间。微软推荐使用MSXML3.DLL和MSXML6.DLL,一个是最广泛的,一个是最新的。
在VC中使用import导入dll后,可以使用上面的MSXML,但是需要注意的是,__uuidof(MSXML2::DOMDocument)创建IXMLDOMDocumentPtr对象时的一些问题。需要注意的是,即使你在文件开头用import导入了MSXML4.DLL或者其他版本,__uuidof(MSXML2::DOMDocument)加载的仍旧是MSXML3.DLL中的接口对象,微软的原话是 The versionindependent ProgID is always bound to MSXML 3 (a lot of people think it picks up the
latest MSXML that is on the box). This means the version independent ProgID and the “3.0” ProgIDs will return the same object.
因此,无比记住自己使用什么版本创建DOMDocument,必须制定其版本号,如MSXML4.DLL使用的MSXML2::DOMDocument40来获取uuid,即 __uuidof(MSXML2::DOMDocument40),当然是用其他版本的MSXML,可以先使用__uuidof(MSXML2::DOMDocument)来生成tlh文件,之后在tlh文件查找正确要使用的DOMDocument。
后记:
在最近新开发的ActiveX控件中,频频出现一些问题,有些知道的,也有些不知道的。新近的一次调试中,使用MSXML2::IXMLDOMDocumentPtr对象的指针进行xml的save方法调用,结果爆出异常,非常纳闷,后来发现,我导入的头是msxml4.dll,而内存中加载的是msxml3.dll,很明显,这之间必然会有一些问题,但是为什么连保存也不能够我也不清楚,希望了解的告诉一声。
这里有一篇如何使用MSXML方法的blog