【问题标题】:Can I use all the functionally I see exposed by the .TLH file?我可以使用 .TLH 文件公开的所有功能吗?
【发布时间】:2015-01-20 06:25:42
【问题描述】:

背景:

我有一个使用 Microsoft 提供的功能的现有代码,通过 HTTP 发布 XML 数据。具体来说,来自 msxml4.dll (COM) 的 IServerXMLHTTPRequest(包含在 MSXML3 及更高版本中)。我正在转向 msxml6.dll,因为不再支持 msxml4.dll(被 MSXML6 取代)。 More information about MSXML versions.

代码:

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

问题:

使用 msxml4.dll 和 msxml6.dll 构建我的应用程序时,以下内容分别包含在 msxml4.tlh 和 msxml6.tlh 中:

struct __declspec(uuid("88d969c6-f192-11d4-a65f-0040963251e5"))
ServerXMLHTTP40;
    // [ default ] interface IServerXMLHTTPRequest2

据我了解,查看 msxml6.tlh,我可以将ServerXMLHTTP40(而不是将代码更改为ServerXMLHTTP60)与 msxml6.dll(DOMDocument40FreeThreadedDOMDocument40XMLSchemaCache40 等相同。 )。

现在,在全新的 Windows 7 Ultimate 安装中搜索注册表,我找不到上面的 uuid。结果,这段代码在这台机器上失败了:

hr = spIXMLHTTPRequest.CreateInstance(__uuidof(ServerXMLHTTP40));

问题:

如果 msxml6 暴露了 ServerXMLHTTP40,为什么我在注册表中找不到它?安装了msxml6(没有安装msxml4)可以用ServerXMLHTTP40吗?

需要更多信息?让我知道。谢谢!

【问题讨论】:

  • 如果您希望程序员迁移到您的软件的下一个版本,那么您不会强迫他们更改所有内容。 .h 文件的粒度不够细,无法让他们零碎地做,所以他们通过包含新旧声明来解决它。您可以从 .h 文件中看出主要版本是 2.6、3.0、4.0 和 6.0

标签: c++ dll com msxml typelib


【解决方案1】:

.TLH 文件(作为从 .TLB 导入的产品,它又是 .IDL 文件的编译版本)是对接口、结构、方法等的描述,用于通过 COM 与另一个对象通信。不保证或承诺实现这些接口的另一方已安装或以其他方式可用,甚至根本不存在。

是的,为方便起见,您已经定义了签名。您可能需要安装实现该功能的运行时。无论您从何处获得开发详细信息,MSXML 4 都可能需要单独安装。

【讨论】:

  • “是的,您已经为您的方便定义了签名” - 令人困惑的方便 LOL
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-29
  • 1970-01-01
  • 1970-01-01
  • 2017-12-27
  • 2021-12-27
  • 2011-08-30
相关资源
最近更新 更多