Delphi 的 TXMLDocument 如何决定使用哪个 MS XML 版本(3.0、6.0 甚至 4.0)?

How does Delphi's TXMLDocument decide which MS XML version (3.0, 6.0 or even 4.0) to use?

我有一个用 Delphi 6 编写的程序,它使用 TXMLDocument,并且在运行时它使用 MS XML 3.0 解析器。但是该程序在一台计算机上报告 The specified module could not be found 错误,并且 Process Monitor 报告该程序正在尝试访问 MS XML 4.0 模块和注册表项。此 4.0 安装是 incomplete/corrupted,这就是访问失败并显示 The specified module could not be found 的原因。

所以,核心问题是一些 mechanism/decision 算法转移 TXMLDocument 使用标准 MS XML 3.0 或 MS XML 6.0 版本在所有当前 Windows 10 机器上,并且按 TXMLDocument 以使用 MS XML 4.0 版本。 TXMLDocument中的这个决策机制是什么以及如何纠正它?

当然,我可以在客户端计算机上找到、下载并安装 MS XML 4.0,但这似乎不是正确的解决方案。

这里没有秘密魔法。使用什么机制是众所周知的。您可以在 Delphi 的 msxmldom.pas 文件中查看自己的源代码。

TXMLDocument 在 Windows 上使用 MSXML DOMVendor 时,它只是在循环中调用 CoCreateInstance() 以尝试实例化不同版本 MSXML 的硬编码列表IXMLDOMDocument COM 对象,按版本降序排列,直到一个版本最终成功,否则全部失败。

MSXML 6.0 在 Delphi 6 发布时还不存在,因此它不是尝试的版本。你说 MSXML 4.0 在你客户的系统上坏了。所以最终改用 MSXML 3.0 是有道理的。

请查看以下问题,了解如何使 TXMLDocument 在如此旧的 Delphi 版本中使用 MSXML 6.0:

How to create a TXML Document using MSXML 6.0 in Delphi 7?