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 = 'cSystem' then
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