Autor Beitrag
hRb
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 303
Erhaltene Danke: 12



BeitragVerfasst: Gestern um 15:39 
Hallo zusammen
Ich will ein in die Jahre gekommenes Programm von WIN32 auf WIN64 umstellen. Nach unklaren Fehlern habe ich neuen Ordner angelegt, neue Form erstellt und alle Objekte aus altem Programm einkopiert. Units übernommen, Ereignisse neu eingetragen. Kann fehlerfrei übersetzen, erhalte aber beim Start eine Zugriffsverletzung. Habe zwei Units. Im Vergleich zum WIN32-Compiler fehlt im Project-Manager eine Datei mit Namen PROJECT1_TLB.pas (die ich auch nie selbst erstellt oder hinzugefügt habe). Dachte, dass diese Datei vom Compiler selbst neu erstellt wird.
Im neu erstellten Ordner wurde automatisch u.a. ein WIN64-Ordner erstellt mit Unterordner Debug, In diesem befindet sich neben der neuen .exe die Datei PROJECT1_TLB.dcu, aber nicht PROJECT1_TLB.pas.
Im Ordner Debug finde auch noch die Dateien: PROJECT1.rsm, Unit1.dcu, Unit2.dcu. Diese Ordner standen früher im Hauptordner
Frage: ist fehlende ..TLB.pas der Grund für die Zugriffsverletzung und wie komme ich zu einer lauffähigen Version? Oder anders gesagt: wie "zwinge" ich den Compiler diese Datei zu erstellen?
hRb
hRb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 303
Erhaltene Danke: 12



BeitragVerfasst: Heute um 18:23 
Konnte den Fehler weiter eingrenzen. In meiner Anwendung gibt es 14 Richedit-Objekte. Um sie allgemein ansprechen zu können definiere ich eine globale Variable
ausblenden Delphi-Quelltext
1:
var Re : Array[1..14] of TRichedit					

Unter Form1.Create weise ich zu
ausblenden Delphi-Quelltext
1:
2:
3:
4:
Re[1] := Richedit1;
Re[2] := Richedit2:
..
Re[14]:= Richedit14;

Im Programmcode steht dann z.B.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
with Re[vAktulleRe] do
begin 
  LinesBeginUpdate;   // kein Fehler
  Modified := false;  // hier Zugriffsverletzung
...
  LinesEndupdate
end

Die Frage ist, warum der Quellcode mit Delphi32-Compiler alles bestens funktioniert und nicht mit Delphoi64. Muss ich andere Uses einbinden und wenn ja wie?

Mit KI erhalte ich folgende Hinweise: (wahrscheinlich fette Texte)
Eine Fehlermeldung wie „Zugriffsverletzung bei Adresse FFFFFFFFAE50080D“ (Access Violation) in Delphi bedeutet im Kern, dass Ihr Programm versucht hat, auf einen Speicherbereich zuzugreifen, der ihm nicht gehört oder der zu diesem Zeitpunkt nicht (mehr) existiert.
In der Regel handelt es sich dabei um das Lesen oder Schreiben über einen ungültigen Zeiger (Pointer).

Warum ist die Adresse so lang? (FFFFFFFF...)

Die vielen Fs am Anfang der Adresse (FFFFFFFF...) sind ein typisches Zeichen dafür, dass es sich um eine 64-Bit-Anwendung (Win64) handelt. Bei 64-Bit-Systemen werden Adressen oft durch Vorzeichenerweiterung (Sign Extension) so dargestellt, wenn im negativen Adressraum oder in bestimmten Systembereichen operiert wird, oder wenn ein ungültiger Zeiger (wie -1 oder ein korrupter Speicherwert) verwendet wurde.

Die 4 häufigsten Ursachen in Delphi
(*
1. Nutzung eines nicht erzeugten Objekts (Nil-Pointer)
Sie versuchen, auf eine Methode oder Eigenschaft eines Objekts zuzugreifen, das noch gar nicht mit Create instanziiert wurde.
• Beispiel: Kunde.Name := 'Max'; aufgerufen, bevor Kunde := TKunde.Create; ausgeführt wurde.
2. Nutzung eines bereits freigegebenen Objekts (Dangling Pointer)
Das Objekt wurde bereits im Speicher gelöscht (z. B. via Free oder Destroy), aber das Programm versucht später erneut, darauf zuzugreifen.
• Tipp: Nutzen Sie FreeAndNil(Objekt); statt Objekt.Free;. Dadurch wird die Variable nach dem Löschen auf nil gesetzt. Wenn Sie dann fälschlicherweise darauf zugreifen, knallt es zwar meistens immer noch, aber bei einer sauberen Adresse wie 0000000000000000, was viel leichter zu debuggen ist.
*)
3. Indizierungsfehler bei Arrays oder Listen (Buffer Overflow)
Sie greifen auf ein Element in einem dynamischen Array, einer TList oder einer TStringList zu, das außerhalb der erlaubten Grenzen liegt (z. B. Zugriff auf Index 10, obwohl das Array nur 5 Elemente hat).
4. Fehler bei Windows-API-Aufrufen oder DLLs
Wenn Sie externe DLLs einbinden oder direkt mit der Windows-API kommunizieren, kann diese Meldung auftreten, wenn falsche Datentypen übergeben werden (z. B. wenn die DLL ein 32-Bit-Objekt erwartet, Delphi 13 es aber als 64-Bit-Objekt übergibt, oder umgekehrt).