gpt4 book ai didi

XML:未安装 MSXML

转载 作者:数据小太阳 更新时间:2023-10-29 01:42:34 25 4
gpt4 key购买 nike

使用此代码获取站点的 rss。此代码适用于我的计算机和许多其他计算机。但在某些计算机(Windows XP 或 7)中,我收到此错误:未安装 MSXML

我该如何解决这个问题?怎么了?

代码如下:

procedure My_Thread.Execute;
var
http : tidhttp;
strm : tmemorystream;
str,sTitle, sDec ,er : string;
StartItemNode : IXMLNode;
ANode : IXMLNode;
XMLDoc : IXMLDocument;

begin
http := tidhttp.Create();
strm := tmemorystream.Create;
try
http.Get('http://www.sample.com/rss.xml',strm); //Download the RSS file
SetString(str,PANSIChar(strm.Memory),strm.Size);

XMLDoc := LoadXMLData(str);

StartItemNode := XMLDoc.DocumentElement.ChildNodes.First.ChildNodes.FindNode('item');
ANode := StartItemNode;

i := 0;
repeat
inc(i);
sTitle := ANode.ChildNodes['title'].Text;
sDec := ANode.ChildNodes['description'].Text;
Synchronize(procedure begin //Synchronize? I'm using threads
case I of
1: begin
main_frm.edit1.text := sTitle; //main_frm is my form
main_frm.edit2.text := sDec;
end;
2: begin
main_frm.edit3.text := sTitle;
main_frm.edit4.text := sDec;
end;
3: begin
main_frm.edit5.text := sTitle;
main_frm.edit6.text := sDec;
end;
end;
ANode := ANode.NextSibling;
end);
until ANode = nil;

http.Free;
strm.Free;

except
on E: Exception do
begin
er := e.Message;
Synchronize(procedure begin
ShowMessage(er);
end);
end;
end;
end;

如您所见,我正在使用线程。所以需要 Synchronize

最佳答案

在 Windows 上,TXMLDocument 默认使用 MSXML,它使用 COM 对象。您的线程在加载 XML 之前未调用 CoInitialize/Ex(),因此 COM 无法实例化 IXMLDocument 尝试在内部创建的任何 MSXML COM 对象(它尝试创建多个 COM 对象以发现实际安装了哪个版本的 MSXML)。您看到的错误消息表示所有 MSXML COM 对象都未能实例化。

您必须在访问 COM 对象的每个线程上下文中调用 CoInitialize/Ex(),例如:

procedure My_Thread.Execute;
var
...
begin
CoInitialize(nil);
try
...
XMLDoc := LoadXMLData(str);
try
...
finally
// Since CoInitialize() and CoUninitialize() are being called in the same
// method as local COM interface variables, it is very important to release
// the COM interfaces before calling CoUninitialize(), do not just let them
// release automatically when they go out of scope, as that will be too late...
StartItemNode := nil;
ANode := nil;
XMLDoc := nil;
end;
...
finally
CoUninitialize;
end;
end;

更新:如果您不想依赖于此:您可以使用您选择的不同 XML 库,而不必使用 MSXML:

Using the Document Object Model

Selecting an XML Vendor

When you build an application, RAD Studio uses the default built-in XML vendor, MSXML.

If you do not specify a different XML vendor, your application does not have XML support on other platforms than Windows, and you see a run-time exception when you run your application in other platforms. For cross-platform applications, OmniXML is currently the best choice, as it shows much better performance than ADOM.

To choose a different XML vendor, add a reference to the unit of the vendor into the unit where you use the RTL XML features, such as the TXMLDocument class. If you add more than one XML vendor unit, the first unit referenced is used as XML vendor. If you need to override this behavior, change the value of the DefaultDOMVendor global variable to the global variable of the XML vendor that you want to use.

Note: You can look up the unit and the global variable of each XML vendor in the List of Built-in XML Vendors above.

When you use the TXMLDocument component, you can choose an XML vendor using its DOMVendor property. When you change the value of DOMVendor, the unit that uses the component is configured to use the specified XML vendor, so that you do not need to change unit references or the DefaultDOMVendor global variable manually.

关于XML:未安装 MSXML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20478739/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com