Einzelnen Beitrag anzeigen

Klaus01
Online

Registriert seit: 30. Nov 2005
Ort: München
5.755 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
Miniaturansicht angehängter Grafiken
callstack.png  
Klaus

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