Visual C ++中的容错DLL使用

时间:2014-11-10 18:42:45

标签: c++ windows dll com msxml

背景

我有一个使用Microsoft提供的功能的现有代码,用于通过HTTP发布XML数据。具体来说,来自msxml4.dll(COM)的IServerXMLHTTPRequest(包含在MSXML3及更高版本中)。

问题:

在可能的情况下,如果客户端工作站上的MSXML4.DLL 缺失,则所描述的POST操作将只是失败More information about MSXML versions

当前代码:

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

备选方案:

  1. MSXML6的硬编码(而不是MSXML4)。不是一个好的解决方案,因为我们不知道工作站上安装了什么MSXML版本。此外,如果Microsoft将发布下一个DLL版本,代码将再次中断。
  2. 从注册表动态加载最新版本: Find MSXML version from registryDynamically load a function from a DLL
  3. 请改用type library
  4. 我很乐意听到其他选择
  5. 问题:

    将代码更改为 MSXML版本无关的最简单,最强大的方法是什么?也就是说,无论客户端计算机上实际安装的MSXML版本如何,都使用IServerXMLHTTPRequest。如果未安装任何版本的MSXML,请提示用户并正常退出。

    需要其他信息吗?请告诉我

    谢谢!

1 个答案:

答案 0 :(得分:1)

来自MSDN

  

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

这意味着没有安装COM类,您可以实例化,期望最新安装的版本将被选中,否则其他人将根据可用性或其他标准决定是否加载MSXML 4或6。

您应该使用特定版本并依赖于相应的运行时可用或安装。或者,您可以在代码as you already discovered中切换MSXML版本。