Import COM的DLL的真正含义,以及如何保持在新老环境上兼容

请参考文章:XP工程移植Vista上找不到msxml.dll错误 (http://blog.csdn.net/immcss/article/details/3862184

解析XML文件使用到了微软的msxml ,在xp下使用的时候,只要#import <msxml.dll>编译就可以顺利通过,

当把工程移植到Vista上的时候就会遇到找不到 msxml.dll的错误。 原来在Vista上msxml.dll升级为msxml6.dll,只要把#import <msxml.dll>改成#import <msxml6.dll>相应using namespace MSXML改成using namespace MSXML2编译即可通过。

那么Vista下编译后的可执行文件是不是不可以在XP下使用呢?

网上的有种方法是: 
#if (_WIN32_WINNT >= 0x0600) 
#import <msxml6.dll> 
#else 
#import <msxml.dll> 
#endif 

这种做法是没有必要的 

下面是一位网友给出的解释

COM组件的使用方式,开发环境和运行环境是不同的。开发环境要使用最新的SDK才能支持最新的操作系统,所以要用#import msxml6.dll,但是到了运行环境,程序并不会直接加载msxml6.dll,而是通过CoCreateInstance来加载的,传递的是PROGID或者CLSID系统会在注册表中找到对应的dll文件,如果运行在vista下,系统会帮你加载msxml6.dll,如果在xp环境下,系统帮你加载msxml.dll但是程序不能使用IXmlDocument6,因为在XP环境下,msxml.dll并不支持这个版本。 

这个特征是COM最基本的特征:保持二进制兼容,即使组件版本升级,也能在新环境下运行旧版的程序,因为新版组件一定会保留旧版组件的接口。

补充:"但是程序不能使用IXmlDocument6,因为在XP环境下,msxml.dll并不支持这个版本",是指在代码中如果你使用了IXmlDocument6,在开发环境(Vista)下,你可以顺利编译并执行通过,但是在执行环境(XP)下,由于它没有这个借口,所以程序运行会弹框。这时你需要做的,是在运行时判断OS的版本,根据不同版本,使用IXmlDocument6接口或老接口。这个只能在运行时由代码解决,而不能在编译期解决。解决办法就是检查是否有msxml6.dll文件,如果有,使用IXmlDocument6,如果没有,就使用老接口。靠代码分支来解决。

posted @ 2013-05-30 18:57  金石开  阅读(523)  评论(0)    收藏  举报