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
Benutzerbild von Dalai
Dalai
Online

Registriert seit: 9. Apr 2006
1.684 Beiträge
 
Delphi 5 Professional
 
#1

AW: Zugriffsverletzung beim Zerstören der TIniFile-Instanz

  Alt 28. Jan 2021, 11: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 11:15 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Zugriffsverletzung beim Zerstören der TIniFile-Instanz

  Alt 28. Jan 2021, 13: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;
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
TheSledgeHammer

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

AW: Zugriffsverletzung beim Zerstören der TIniFile-Instanz

  Alt 28. Jan 2021, 14: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
Antwort Antwort


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 16:09 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-2025 by Thomas Breitkreuz