首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XML:未安装MSXML

XML:未安装MSXML
EN

Stack Overflow用户
提问于 2013-12-09 19:12:12
回答 3查看 16.7K关注 0票数 13

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

我怎样才能解决这个问题?怎么了?

以下是代码:

代码语言:javascript
复制
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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-09 23:27:24

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

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

代码语言:javascript
复制
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;

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

使用文档对象模型

选择XML供应商 在构建应用程序时,RAD使用默认的内置XML供应商MSXML。 如果不指定不同的XML供应商,则应用程序在Windows以外的其他平台上不支持XML,并且在其他平台上运行应用程序时会看到运行时异常。对于跨平台应用程序,OmniXML目前是最好的选择,因为它显示出比ADOM更好的性能。 若要选择不同的XML供应商,请将添加引用转到供应商的单元中,在其中使用RTL特性,如TXMLDocument类。如果添加了多个XML供应商单元,则引用的第一个单元将用作XML供应商。如果需要重写此行为,请将DefaultDOMVendor全局变量的值更改为要使用的XML供应商的全局变量。 注意:您可以在上面的内置XML供应商列表中查找每个XML供应商的单元和全局变量。 当您使用TXMLDocument组件时,您可以使用它的DOMVendor属性选择XML供应商。当您更改DOMVendor的值时,使用该组件的单元被配置为使用指定的XML,因此不需要手动更改单元引用或DefaultDOMVendor全局变量。

票数 36
EN

Stack Overflow用户

发布于 2013-12-09 19:24:33

需要在安装之前安装MSXMLS。在servicePack2 for XP中,MSXML4.0ServicePack 2() ( MSXML ) 6.0适用于windows 7.再见

票数 1
EN

Stack Overflow用户

发布于 2017-04-15 06:11:12

我在一个Delphi项目中也遇到了同样的问题,但我使用的是IdThreadComponent而不是Thread对象。我的问题是: DOC:= NewXMLDocument;我从线程运行方法中删除了这一行,并将其放在调用线程之前,如下所示::= NewXMLDocument;IdThreadComponent1.Start;

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20478739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档