Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   XML crash bei wiederholtem Laden (https://www.delphipraxis.net/211871-xml-crash-bei-wiederholtem-laden.html)

TurboMagic 14. Nov 2022 13:15

XML crash bei wiederholtem Laden
 
Hallo,

kleines böses Problem in 11.2. Der nachfolgende Code wird einmal erolgreich aufgerufen
und die XML Datei geladen. Später wird dieser Code erneut aufgerufen aber es crasht mit
einer Schutzverletzung. Dabei ist es unerheblich ob die selbe Datei nochmal geladen werden
soll oder eine andere. Wo crasht es? Irgendwo nach dem .Active Aufruf.

Delphi-Quellcode:
procedure TProjectSettings.LoadFromXML(const FileName: string);
var
  LDocument: IXMLDocument;
  LUnitTestFiles, LSourceFiles, LOutput, LMisc, LNode: IXMLNode;
  SourceFileName : string;
  IsSelected     : Boolean;
begin
  Assert(FileName <> '', 'No file name for the XML file specified');

  FFileName        := FileName;

  LDocument        := TXMLDocument.Create(FFileName);
  LDocument.Options := [doNodeAutoIndent];
  LDocument.Active := true;
Der gesamte Code ist im Master Branch dieses Projektes zu finden:
https://github.com/MHumm/delphi-code...ge-wizard-plus

Grüße
TurboMagic

Klaus01 14. Nov 2022 13:31

AW: XML crash bei wiederholtem Laden
 
.. hast Du kein coInitialize(nil) aufgerufen?

Das benötigt meines Wissens IXmlDocument und Co.
Grüße
Klaus

himitsu 14. Nov 2022 13:33

AW: XML crash bei wiederholtem Laden
 
Wenn man die VCL (TForm) nutzt, dann wurde das CoInitialize für den Hauptthred bereits erledigt.

peterbelow 14. Nov 2022 16:15

AW: XML crash bei wiederholtem Laden
 
Zitat:

Zitat von TurboMagic (Beitrag 1514754)
Hallo,

kleines böses Problem in 11.2. Der nachfolgende Code wird einmal erolgreich aufgerufen
und die XML Datei geladen. Später wird dieser Code erneut aufgerufen aber es crasht mit
einer Schutzverletzung. Dabei ist es unerheblich ob die selbe Datei nochmal geladen werden
soll oder eine andere. Wo crasht es? Irgendwo nach dem .Active Aufruf.

Delphi-Quellcode:
procedure TProjectSettings.LoadFromXML(const FileName: string);
var
  LDocument: IXMLDocument;
  LUnitTestFiles, LSourceFiles, LOutput, LMisc, LNode: IXMLNode;
  SourceFileName : string;
  IsSelected     : Boolean;
begin
  Assert(FileName <> '', 'No file name for the XML file specified');

  FFileName        := FileName;

  LDocument        := TXMLDocument.Create(FFileName);
  LDocument.Options := [doNodeAutoIndent];
  LDocument.Active := true;
Der gesamte Code ist im Master Branch dieses Projektes zu finden:
https://github.com/MHumm/delphi-code...ge-wizard-plus

Grüße
TurboMagic

Stell sicher, daß all diese IXMLNode-Referenzen auf nil gesetzt werden, bevor LDocument selbst auf nil gesetzt wird bzw. out of scope geht.

TurboMagic 15. Nov 2022 07:35

AW: XML crash bei wiederholtem Laden
 
Hallo,

habe die jetzt am Ende der Methode auf NIL gesetzt, wird dadurch aber nicht besser.
Gefühlt eher schlechter.

Grüße
TurboMagic

TurboMagic 15. Nov 2022 07:44

AW: XML crash bei wiederholtem Laden
 
Hallo,

ok, ich glaube ich weiß jetzt warum das passiert.
Muss die Nutzung der Klasse komplett auf Interface umstellen.
SOnst wird's irgendwo zu früh frei gegeben.

Grüße
TurboMagic

taveuni 15. Nov 2022 09:14

AW: XML crash bei wiederholtem Laden
 
Ich sehe keinen Fehler in obigem Code. Das wird hier so tausendfach benutzt. Wo tritt den die Schutzverletzung genau auf?
Ausserdem IXMLDocument ist schon ein Interface?

TurboMagic 15. Nov 2022 09:21

AW: XML crash bei wiederholtem Laden
 
Naja, an manchen Stellen im Programm wurde eine Interface Referenz benutzt und an anderen noch eine Objektreferenz.
Das verursacht jedoch Probleme mit der Referenzzählung bzw. das wird dann zu früh freigegeben.

Das ist jetzt gelöst, habe jetzt aber an einer anderen Stelle ein Problem.
Das ist dann aber ein Fall für später...

TurboMagic 15. Nov 2022 12:28

AW: XML crash bei wiederholtem Laden
 
Problem gelöst. Man sollte keine Interface Referenzen in einer TObjectList<T> speichern. Eine TList<Interfacereferenztyp> tut's jetzt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:13 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz