【问题标题】:Delphi : load xml file within a threadDelphi:在线程中加载xml文件
【发布时间】:2017-05-08 22:53:35
【问题描述】:

我正在尝试在 Delphi 的线程中加载 XML 文件,但收到以下错误消息:

未安装 Microsoft MSXML

但是,我的代码在线程之外可以正常工作!

这是我的代码:

procedure NewThread.Execute;
begin
  XMLDocument1 := TXMLDocument.Create(Application);
  XMLDocument1.Active := True;
  XMLDocument1.LoadFromXML('document.xml');
end;

有什么想法吗?

【问题讨论】:

  • 尝试在线程上下文中调用 CoInitialize 和 CoUninitialize
  • 我刚试过 CoInitialize(nil); XMLDocument1 := TXMLDocument.Create(Application); XMLDocument1.Active := 真; XMLDocument1.LoadFromXML('document.xml');联合初始化;但我遇到了同样的错误
  • 没关系,谢谢您的帮助
  • MSXML 基于 ActiveX/COM 技术。该错误意味着无法实例化 MSXML COM 对象。在线程上下文中调用Co(Un)Initialize 是绝对必要的。如果您现在正在执行此操作(并确保您在调用 CoUninitialize 之前 FreeXMLDocument),并且仍然收到错误,那么 MSXML 确实没有安装,或者其他东西阻止了 COM 对象实例化。顺便说一句,LoadFromXML() 需要一个实际的 XML 字符串,而不是文件名。请改用LoadFromFile()
  • 无论如何,您都不应该在线程中使用TXMLDocument.Create(Application)(指定Owner 不是线程安全的)。通过nil 代替Owner (TXMLDocument.Create(nil)),但确保您的XMLDocument1 变量键入为IXMLDocument 而不是TXMLDocument(请阅读文档了解原因)。在这种情况下,您应该只使用独立的LoadXMLDocument()LoadXMLData() 函数,而不是直接实例化TXMLDocument

标签: xml multithreading delphi


【解决方案1】:

MSXML 使用 COM 对象,错误信息表示 MSXML COM 对象无法实例化。

第一步是始终检查您的计算机上是否确实安装了 MSXML,然后您必须在每个访问 COM 对象的线程上下文中调用 CoInitialize/CoUninitialize,并可能尝试使用 try/finally 语句包装它

【讨论】:

  • 如何检查是否安装了MSXML?
  • 您可以检查Windows目录中是否存在MSXML.dll文件
  • 好的,非常感谢
  • @Fero68 仅存在 DLL 是不够的,它的 COM 对象也必须在注册表中注册。
  • @Remy 说的很对
猜你喜欢
  • 2023-04-01
  • 2011-09-11
  • 1970-01-01
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多