使用DocumentElement当在的XMLDocument访问冲突(Access violati

2019-08-04 16:32发布

当我尝试使用我总是得到一个访问冲突DocumentElement的的XMLDocument 。 我创建XMLDocument基于某些文件的存在。

错误信息

“模块地址0047B152访问冲突‘引发的异常类EAccessViolation与消息地址B1D59357的project1.exe'.Read’项目PROJECT1.EXE

我的代码

unit XMLBase;

interface
uses
  SysUtils, xmldom, XMLIntf, XMLDoc, Forms;

type
  TXMLbase = class
  private
    { Private declarations }
  public
    XMLDocument1: TXMLDocument;
    root: IXMLNode;    
    constructor Create;
  end;

var
  fn: string;

implementation

constructor TXMLbase.Create;
begin   
  fn := ChangeFileExt(Application.ExeName, '.xml');
  XMLDocument1 := TXMLDocument.Create(nil);
  XMLDocument1.Options := [doNodeAutoIndent];
  XMLDocument1.Active := False;
  //optional, is used to indent the Xml document
  if FileExists(fn) then
  begin
  XMLDocument1.LoadFromFile(fn);
  XMLDocument1.Active:= True;
  root := XMLDocument1.DocumentElement;  //<<--- Access Voilation
  end
  else
  begin
    XMLDocument1.Active := False;
    XMLDocument1.XML.Text := '';
    XMLDocument1.Active := True;
    root := XMLDocument1.AddChild('Settings');    
  end;
XMLDocument1.SaveToFile(fn);
end;

end.

访问冲突的出现是由于物体或指针的初始化不当,这是否意味着XMLDocument未被初始化?

Answer 1:

正如指出的大卫只是改变从XMLDocument1声明XMLDocument1: TXMLDocumentXMLDocument1: IXMLDocument解决了这个问题。 你的问题涉及到使用TXMLDocument的



Answer 2:

你是路过nilTXMLDocument.Create 。 当你这样做时,对象的行为就像TInterfacedObject 。 它的生命周期由接口引用计数管理。 但你不守的接口的引用。

该文件涵盖这在一些细节上。

当TXMLDocument的是没有所有者创建的,它的行为就像一个接口对象。 也就是说,当其接口的所有引用被释放时,TXMLDocument的实例被自动释放。 当TXMLDocument的与一个所有者创建的,但是,它的行为就像任何其他组件,以及通过其拥有者释放。

如果启用调试的DCU并设置一个断点TXMLDocument.Destroy可以观察的对象只是你的访问冲突之前被销毁。

解决了两种问题:

  1. 当您创建文档传递的所有者。
  2. 切换为使用接口来指代对象。 也就是说声明XMLDocument1IXMLDocument

请确保你做一个或其他的这些,但不能同时!



文章来源: Access violation when using DocumentElement In XMLDocument