![]() |
AW: Zugriffsverletzung beim Zerstören der TIniFile-Instanz
Zitat:
Delphi-Quellcode:
program Project769;
{$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; begin try TObject(nil).Free; Writeln('Geht doch'); except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; Readln; end. |
AW: Zugriffsverletzung beim Zerstören der TIniFile-Instanz
Ich meine mich zu erinnern, ein ähnliches oder gar gleiches Problem mit "Invalid handle" Exceptions gehabt zu haben gehabt zu haben, als ich ein Formular in einer DLL erzeugt hatte. Die Klasse TForm greift an bestimmten Stellen auf das TApplication-Objekt zu. In der DLL ist aber nie eine Instanz dieses Objekt erzeugt worden, und daher ist Application.Handle (und Application.MainFormHandle) nicht gesetzt und daher ungültig, wahrscheinlich 0. Daher musst du beim Erzeugen der Form in der DLL ein gültiges Handle an TForm.WndParent übergeben und damit indirekt Application.Handle befüllen.
Siehe auch ![]() Grüße Dalai |
AW: Zugriffsverletzung beim Zerstören der TIniFile-Instanz
Dann kommt der Fehler aber nicht wegen dem NIL.
Bei NIL wird nichts gemacht, so wie es sein soll. Sollte es nicht nil sein und in dem Objekt, was eventuell auch ein ungültiger Zeiger sein könnte, stimmen irgendwelche Zeiger/Handle nicht, dann ist das kein Problem von Free oder FreeAndNil. Zitat:
|
AW: Zugriffsverletzung beim Zerstören der TIniFile-Instanz
Zitat:
Und was ich auch ausschließen kann, war meine Vermutung, dass der parallele Zugriff auf eine einzige physische Datei durch mehrere Instanzen des TIniFile-Objekts zu Problemen führen würde. Hab mir da eine Test-Applikation geschrieben mit 4 Timern drauf und die haben in die eine Ini-Datei problemlos geschrieben. Zwei Zeitstempel waren sogar auf die Milisekunde identisch, also irgendwie ist das schon synchronisiert; zumindest bei EXE-Projekten. Ob das bei DLL-Projekten auch so ist, das wissen nur die Götter des Olymps ;) |
AW: Zugriffsverletzung beim Zerstören der TIniFile-Instanz
Zitat:
Delphi-Quellcode:
?
TObject(nil).Free;
Delphi-Quellcode:
Ein Unterschied wäre das hier:
var
fObject: TMyObj; begin fObject := TMyObj.Create; try fObject.Trallalla; finally fObject.Free; end; fObject.Free; //was passiert hier? end;
Delphi-Quellcode:
var
fObject: TMyObj; begin fObject := TMyObj.Create; try fObject.Trallalla; finally fObject.Free; fObject := nil; //Ein kleiner, aber feiner Unterschied end; fObject.Free; //dann passiert nichts. end; |
AW: Zugriffsverletzung beim Zerstören der TIniFile-Instanz
Das ist aber auch völlig unterschiedlicher Code. Eine Instanzvariable, die nil ist, verursacht beim Aufruf von Free keinen Fehler (im Gegensatz zu Destroy). Darum ging es in der Aussage.
|
AW: Zugriffsverletzung beim Zerstören der TIniFile-Instanz
Zitat:
|
AW: Zugriffsverletzung beim Zerstören der TIniFile-Instanz
Zitat:
Wenn die Referenz nicht nil ist, knallt es mit oder ohne Assigned ggf., ist sie nil, knallt es in beiden Fällen nicht. |
AW: Zugriffsverletzung beim Zerstören der TIniFile-Instanz
Zitat:
Ich verwende jedenfalls nie Object.Free sondern immer FreeAndNil(Object). Mir sind solche AVs beim Free auch gut bekannt, die treten gerne mal auf wenn es an anderer Stelle vor dem Free einen Speicherüberlauf gegeben hat. Noch ein Gedanke: Ist PChar hier überhaupt gleich PChar aus der Hostanwendung? Stichwort PAnsiChar und PWideChar... |
AW: Zugriffsverletzung beim Zerstören der TIniFile-Instanz
Ob Free oder FreeAndNil macht keinen Unterschied, denn FreeAndNil ruft auch nur Free auf.
Außer dass FreeAndNil eigentlich NilAndFree heißen müsste, da es zuerst die Variable auf NIL setzt und danach Free aufruft. Das Einzige, wo FreeAndNil anders arbeiten könnte, als wie Free, das wäre im Nextgen, wo dabei auch noch die Referenzzählung mitspielen würde, wobei dort Free ja eigentlich garnichts macht. (dessen Inhalt ist dort deaktiviert) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:21 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 by Thomas Breitkreuz