【发布时间】: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之前Free和XMLDocument),并且仍然收到错误,那么 MSXML 确实没有安装,或者其他东西阻止了 COM 对象实例化。顺便说一句,LoadFromXML()需要一个实际的 XML 字符串,而不是文件名。请改用LoadFromFile()。 -
无论如何,您都不应该在线程中使用
TXMLDocument.Create(Application)(指定Owner不是线程安全的)。通过nil代替Owner(TXMLDocument.Create(nil)),但确保您的XMLDocument1变量键入为IXMLDocument而不是TXMLDocument(请阅读文档了解原因)。在这种情况下,您应该只使用独立的LoadXMLDocument()或LoadXMLData()函数,而不是直接实例化TXMLDocument。
标签: xml multithreading delphi