AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

IXmlDocument wirft Exception

Ein Thema von Klaus01 · begonnen am 10. Nov 2020 · letzter Beitrag vom 10. Nov 2020
Antwort Antwort
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.641 Beiträge
 
Delphi 10.4 Sydney
 
#1

IXmlDocument wirft Exception

  Alt 10. Nov 2020, 11:05
Delphi-Version: 10.3 Rio
Hallo,

mein Problem:
Diese Routine wirft beim Verlassen eine Exception:
Delphi-Quellcode:
procedure TCodeSystemReader.readFile(fileName: String);
var
  xmlDoc: IXmlDocument;
  xmlNode: IXmlNode;
  xmlNodeList: IXmlNodeList;
  i: Integer;
  csElement: TCodeSystemElement;
begin
  CoInitialize(nil);
  try
    xmlDoc := loadXmlDocument(fileName);
    xmlDoc.Active := true;
    xmlNodeList := xmlDoc.DocumentElement.ChildNodes;
    for i := 0 to xmlNodeList.Count -1 do
      begin
        xmlNode := xmlNodeList[i];
        if xmlNode.NodeName = 'cSystemthen
          begin
            csElement.codeValue := xmlNode.ChildNodes.findNode('code').Attributes['value'];
            csElement.displayValue := xmlNode.ChildNodes.FindNode('display').Attributes['value'];
            fCodeSystemList.Add(csElement);
          end;
      end;
  finally
    CoUnInitialize;
  end;
end;
Die Exception:
Code:
AccessViolation with message 'Zugriffsverletzung bei Adresse 00412C02 in Modul '....exe'. Lesen von Adresse 039D8C08'
Aufgerufen wird der Code in einem Unit-Test:
Delphi-Quellcode:
procedure TTestCodeSystemReader.readCodeSystemFile(const filename: String);
begin
  fCodeSystemReader := TCodeSystemReader.Create;
  try
    fCodeSystemReader.readFile(filename);
    assert.IsTrue(fCodeSystemReader.getCount > 0);
  finally
    fCodeSystemReader.Free;
  end;
end;
Der Stack: (siehe Anhang)
Wenn im debug mode "break" gedrückt wird, kommt das Programm hier zu stehen (system.pas)
Delphi-Quellcode:
function _IntfClear(var Dest: IInterface): Pointer;
{$IFDEF PUREPASCAL}
var
  P: Pointer;
begin
  Result := @Dest;
  if Dest <> nil then
  begin
    P := Pointer(Dest);
    Pointer(Dest) := nil;
    IInterface(P)._Release;
  end;
end;
{$ELSE !PUREPASCAL}
{$IFDEF CPUX86}
asm
        MOV EDX,[EAX]
        TEST EDX,EDX
        JE @@1
        MOV DWORD PTR [EAX],0
{$IFDEF ALIGN_STACK}
        SUB ESP, 4
{$ENDIF ALIGN_STACK}
        PUSH EAX
        PUSH EDX
        MOV EAX,[EDX] /// <---
        CALL DWORD PTR [EAX] + VMTOFFSET IInterface._Release
        POP EAX
{$IFDEF ALIGN_STACK}
        ADD ESP, 4
{$ENDIF ALIGN_STACK}
Wenn jemand eine Idee hätte - wäre das prima.
Grüße
Klaus
Miniaturansicht angehängter Grafiken
callstack.png  
Klaus

Geändert von Klaus01 (10. Nov 2020 um 12:03 Uhr)
  Mit Zitat antworten Zitat
EmWieMichael

Registriert seit: 28. Mär 2012
85 Beiträge
 
#2

AW: TXmlDocument wirft Exception

  Alt 10. Nov 2020, 11:20
Vielleicht hilft schon ein...
XMLDoc:=TXMLDocument.Create();
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.641 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: TXmlDocument wirft Exception

  Alt 10. Nov 2020, 11:37
Danke - aber das hilft nicht weiter.
LoadXmlDocument gibt auch IXMLDocument zurück.
Das Lesen der Daten ist nicht das Problem - die Exception wird geworfen wenn die Routine verlassen wird.
Da werden dann auch die Interface (IXmlNode, IXmlNodeList und IXmlDocument) freigegeben weil der Scope verlassen wird.
Klaus
  Mit Zitat antworten Zitat
EmWieMichael

Registriert seit: 28. Mär 2012
85 Beiträge
 
#4

AW: TXmlDocument wirft Exception

  Alt 10. Nov 2020, 11:51
Ach, sorry; ich hatte TXMDocument statt IXMLDocument gelesen...
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
5.787 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: IXmlDocument wirft Exception

  Alt 10. Nov 2020, 12:16
Ohne ein reproduzierbares Minimalbeispiel wird das schwierig. Was ist diese Liste? Was ist ein TCodeSystemElement? Das "IntfClear" spricht eigentlich dafür dass man hier durcheinander gekommen ist in Bezug auf Interface/TObject-Referenzierung. Er scheint also eine Interface-Variable freigeben zu wollen aber das dahinterliegende Objekt wurde bereits zerstört.

Auch: Mir ist das etwas gruselig in einer einzigen Methode CoInitialize / CoUnInitialize aufzurufen. Was ist wenn dein Destruktor oder sonstwas (unbewusst) noch etwas mit der MS-XML-Engine macht während du mit CoUnInitialize schon alles wieder abgebaut hast?
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.641 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: IXmlDocument wirft Exception

  Alt 10. Nov 2020, 12:25
Auch: Mir ist das etwas gruselig in einer einzigen Methode CoInitialize / CoUnInitialize aufzurufen. Was ist wenn dein Destruktor oder sonstwas (unbewusst) noch etwas mit der MS-XML-Engine macht während du mit CoUnInitialize schon alles wieder abgebaut hast?
.. schön, dass Dir gruselig war.
CoInitialize habe ich nun im Constructor untergebracht
CoUnitialize habe ich nun im Destructor

So tut es.

TCodeSystemElement ist ein record
Die Liste eine generische Liste von TCodeSystemElement.

Vielen Dank.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.388 Beiträge
 
Delphi XE5 Professional
 
#7

AW: IXmlDocument wirft Exception

  Alt 10. Nov 2020, 12:27
Entschärft sich das Problem nicht, wenn du
xmlDoc:=nil; vor dem
Finally einfügst?
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.641 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: IXmlDocument wirft Exception

  Alt 10. Nov 2020, 12:30
Entschärft sich das Problem nicht, wenn du
xmlDoc:=nil; vor dem
Finally einfügst?
.. ich hatte es es mal im finally vor CoUninitialze gesetzt - es hate aber keine Auswirkungen auf den Fehler.
Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:10 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf