AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Zugriffsverletzung beim Zerstören der TIniFile-Instanz
Thema durchsuchen
Ansicht
Themen-Optionen

Zugriffsverletzung beim Zerstören der TIniFile-Instanz

Ein Thema von TheSledgeHammer · begonnen am 26. Jan 2021 · letzter Beitrag vom 3. Feb 2021
Antwort Antwort
Seite 4 von 7   « Erste     234 56     Letzte »    
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#31

AW: Zugriffsverletzung beim Zerstören der TIniFile-Instanz

  Alt 28. Jan 2021, 11:20
Free prüft selbst ob die Variable bereits nil ist, dann passiert nichts.
TObject(nil).Free; // läuft problemlos
Das ist falsch. Korrigiert mich bitte, wenn es nach Version Delphi 10.1 anders sein sollte.
Läuft auch unter 10.1 problemlos!
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#32

AW: Zugriffsverletzung beim Zerstören der TIniFile-Instanz

  Alt 28. Jan 2021, 12:03
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 https://www.delphipraxis.net/1293954-post10.html und der damit verbundene Thread. Das Handle ist bei mir das Hauptfenster des Programms, in dem Fall Total Commander, von dem ich dieses Handle auch bekomme.

Grüße
Dalai

Geändert von Dalai (28. Jan 2021 um 12:15 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#33

AW: Zugriffsverletzung beim Zerstören der TIniFile-Instanz

  Alt 28. Jan 2021, 14:59
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:
Delphi-Quellcode:
procedure TObject.Free;
begin
// under ARC, this method isn't actually called since the compiler translates
// the call to be a mere nil assignment to the instance variable, which then calls _InstClear
{$IFNDEF AUTOREFCOUNT}
  if Self <> nil then
    Destroy;
{$ENDIF}
end;

procedure TObject.DisposeOf;
type
  TDestructorProc = procedure (Instance: Pointer; OuterMost: ShortInt);
begin
{$IFDEF AUTOREFCOUNT}
  if Self <> nil then
  begin
    Self.__ObjAddRef; // Ensure the instance remains alive throughout the disposal process
    try
      if __SetDisposed(Self) then
      begin
        _BeforeDestruction(Self, 1);
        TDestructorProc(PPointer(PByte(PPointer(Self)^) + vmtDestroy)^)(Self, 0);
      end;
    finally
      Self.__ObjRelease; // This will deallocate the instance if the above process cleared all other references.
    end;
  end;
{$ELSE}
  Free;
{$ENDIF}
end;
$2B or not $2B
  Mit Zitat antworten Zitat
TheSledgeHammer

Registriert seit: 22. Mai 2019
Ort: Mulfingen
43 Beiträge
 
Delphi 10.3 Rio
 
#34

AW: Zugriffsverletzung beim Zerstören der TIniFile-Instanz

  Alt 28. Jan 2021, 15:15
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 https://www.delphipraxis.net/1293954-post10.html und der damit verbundene Thread. Das Handle ist bei mir das Hauptfenster des Programms, in dem Fall Total Commander, von dem ich dieses Handle auch bekomme.

Grüße
Dalai
Also ich hab das jetzt auch ausprobiert und es ist derselbe Fehler, wie wenn ich das via Application.Handle setze. Wenn ich weder das eine noch das andere mache, erhalte ich zumindest keinen invalid handle value Fehler mehr Also das wird es dann auch nicht sein, so wie himitsu das auch schon vermutet hat.

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
Tobias
  Mit Zitat antworten Zitat
DasWolf

Registriert seit: 7. Jun 2016
76 Beiträge
 
Delphi 10.1 Berlin Professional
 
#35

AW: Zugriffsverletzung beim Zerstören der TIniFile-Instanz

  Alt 29. Jan 2021, 10:08
Free prüft selbst ob die Variable bereits nil ist, dann passiert nichts.
TObject(nil).Free; // läuft problemlos
Das ist falsch. Korrigiert mich bitte, wenn es nach Version Delphi 10.1 anders sein sollte.
Läuft auch unter 10.1 problemlos!
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.
"dann passiert nichts" ist definitiv falsch. Wer macht denn bitteschön TObject(nil).Free; ?

Delphi-Quellcode:
var
  fObject: TMyObj;
begin
  fObject := TMyObj.Create;
  try
    fObject.Trallalla;
  finally
    fObject.Free;
  end;

  fObject.Free; //was passiert hier?
end;
Ein Unterschied wäre das hier:
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;
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#36

AW: Zugriffsverletzung beim Zerstören der TIniFile-Instanz

  Alt 29. Jan 2021, 10:11
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.477 Beiträge
 
Delphi 12 Athens
 
#37

AW: Zugriffsverletzung beim Zerstören der TIniFile-Instanz

  Alt 29. Jan 2021, 10:34
Parameter als PChar sind problemlos verwendbar, solange die übergebenen Zeichenketten in der DLL nicht verändert werden.
Wieder auf String casten und dann verändern ist nicht zulässig.
Doch. Ein "auf String casten" erzeugt eine Kopie des Inhalts.

Man muss nur darauf achten, dass auf beiden Seiten das gleiche PChar verwendet wird, oder besser gleich auf beiden Seiten PAnsiChar oder PWideChar, dann ist es eindeutig.
Das ist richtig, die Kopie kann man natürlich verändern. Delphi behandelt PChar, PAnsiChar, PWideChar anders wie normale Pointer.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#38

AW: Zugriffsverletzung beim Zerstören der TIniFile-Instanz

  Alt 29. Jan 2021, 12:34
Ein Unterschied wäre das hier:
Es ging ja um die Prüfung auf Assigned, also genau auf die Prüfung auf nil. Die passiert eben schon im Free und ist daher unnötig.

Wenn die Referenz nicht nil ist, knallt es mit oder ohne Assigned ggf., ist sie nil, knallt es in beiden Fällen nicht.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#39

AW: Zugriffsverletzung beim Zerstören der TIniFile-Instanz

  Alt 29. Jan 2021, 19:49
Free prüft selbst ob die Variable bereits nil ist, dann passiert nichts.
TObject(nil).Free; // läuft problemlos
Das ist falsch. Korrigiert mich bitte, wenn es nach Version Delphi 10.1 anders sein sollte.
In meinem 10.2.3 knallt das mit einer AV. In Verbindung mit dem eigenwilligen Create innerhalb des try-except-Block könnte es durchaus sein dass die Variable weder nil noch ein gültiges TIniFile ist.

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...
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#40

AW: Zugriffsverletzung beim Zerstören der TIniFile-Instanz

  Alt 29. Jan 2021, 22:02
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)
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 7   « Erste     234 56     Letzte »    


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 05:15 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