C++ visualc+中容错DLL的使用+;

C++ visualc+中容错DLL的使用+;,c++,windows,dll,com,msxml,C++,Windows,Dll,Com,Msxml,背景: #import "msxml4.dll" using namespace MSXML2; … IServerXMLHTTPRequestPtr spIXMLHTTPRequest = NULL; hr = spIXMLHTTPRequest.CreateInstance(__uuidof(ServerXMLHTTP40)); 我有一个现有的代码,它使用Microsoft提供的功能通过HTTP发布XML数据。具体地说,IServerXMLHTTPRequest(包含在MSXML3和更高版

背景:

#import "msxml4.dll"
using namespace MSXML2;
…
IServerXMLHTTPRequestPtr spIXMLHTTPRequest = NULL;
hr = spIXMLHTTPRequest.CreateInstance(__uuidof(ServerXMLHTTP40));
我有一个现有的代码,它使用Microsoft提供的功能通过HTTP发布XML数据。具体地说,IServerXMLHTTPRequest(包含在MSXML3和更高版本中)来自msxml4.dll(COM)

问题:

#import "msxml4.dll"
using namespace MSXML2;
…
IServerXMLHTTPRequestPtr spIXMLHTTPRequest = NULL;
hr = spIXMLHTTPRequest.CreateInstance(__uuidof(ServerXMLHTTP40));
在可能的情况下,如果客户端工作站上缺少MSXML4.DLL,所描述的POST操作将失败

当前代码:

#import "msxml4.dll"
using namespace MSXML2;
…
IServerXMLHTTPRequestPtr spIXMLHTTPRequest = NULL;
hr = spIXMLHTTPRequest.CreateInstance(__uuidof(ServerXMLHTTP40));
备选方案:

#import "msxml4.dll"
using namespace MSXML2;
…
IServerXMLHTTPRequestPtr spIXMLHTTPRequest = NULL;
hr = spIXMLHTTPRequest.CreateInstance(__uuidof(ServerXMLHTTP40));
  • MSXML6(而不是MSXML4)的硬代码。这不是一个好的解决方案,因为我们不知道工作站上安装了什么MSXML版本。此外,如果Microsoft发布下一个DLL版本,代码将再次中断
  • 从注册表动态加载最新版本: 和
  • 用这个来代替
  • 我很高兴听到更多的选择
  • 问题:

    #import "msxml4.dll"
    using namespace MSXML2;
    …
    IServerXMLHTTPRequestPtr spIXMLHTTPRequest = NULL;
    hr = spIXMLHTTPRequest.CreateInstance(__uuidof(ServerXMLHTTP40));
    
    将我的代码更改为不可知MSXML版本的最简单、最健壮的方法是什么?也就是说,不管客户机上实际安装的MSXML版本是什么,都要使用IServerXMLHTTPRequest。如果未安装MSXML版本,请提示用户并正常退出

    需要补充信息吗?请告诉我

    谢谢大家!

    来自:

    MSXML版本3.0是支持版本独立的GUI和ProgID的最后一个MSXML版本。从版本4.0开始,MSXML以并排模式安装在您的计算机上。这意味着,例如,为Microsoft Office应用程序安装MSXML 5.0不会替换计算机上以前安装的任何MSXML解析器版本。这样做是为了保护当前使用MSXML早期版本的应用程序的质量。并排模式还允许您决定在代码中使用哪个版本的解析器

    这意味着没有安装任何COM类,您可以实例化这些COM类,以获取最新安装的版本,否则其他人将根据可用性或其他条件为您决定是否加载MSXML 4或6


    您需要使用特定的版本,并取决于要提供或安装的相应运行时。或者您可以在代码中的MSXML版本之间切换。

    msxml4的要点是您可以自己安装它。因此,如果它丢失了,那么您做错了:)不,MSXML4不再受支持:。我想使用机器上存在的版本。感谢您的评论。您正在创建一个
    ServerXMLHTTP40
    的实例,即版本4对象。如果失败,您可以尝试另一个版本:
    If(FAILED(hr)){//hr=…CoCreateInstance(…60);}
    这正是这家伙所做的:。这并不完全是我想要的,因为我希望在我的代码中没有版本指示(如果可能的话…)。感谢您的评论@RomanR。