AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

IXmlDocument wirft Exception

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

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

IXmlDocument wirft Exception

  Alt 10. Nov 2020, 10: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
Angehängte Grafiken
Dateityp: png callStack.PNG (24,5 KB, 7x aufgerufen)
Klaus

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


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 20:03 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz