【发布时间】:2013-12-27 00:59:37
【问题描述】:
使用此代码获取站点的 rss。此代码适用于我的计算机和许多其他计算机。但在某些计算机(Windows XP 或 7)中,我收到此错误:MSXML Not Installed
我该如何解决这个问题?怎么了?
代码如下:
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。
【问题讨论】:
-
您从异常中得到了该消息,对吧?调试器会中断您的程序并告诉您异常的确切来源,不是吗?所以调试它。至少,在您的问题中包含异常的来源。
-
这是一个完整的旁白,但
Dec是一个用于减少整数的函数(以System为单位)。在这里,您声明了一个字符串变量Dec,它隐藏了该函数。这是一种不好的做法,尤其是对于像dec这样的常用函数 - 您应该为变量使用唯一的名称。 -
@J... 已修复。谢谢
-
我认为您需要在使用 MSXML 之前在线程中调用“CoInitializeEx”。但是在一些电脑上工作..,不知道..
-
ShowMessage 不是远程调试工具。使用 MadExcept 收集真实的异常信息。除非您知道如何解决触发异常的问题,否则不要捕获异常。
标签: xml delphi xml-parsing