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/)
-   -   Delphi FreePascal läuft, Delphi crasht. Finde die Ursache nicht. (https://www.delphipraxis.net/205605-freepascal-laeuft-delphi-crasht-finde-die-ursache-nicht.html)

Der schöne Günther 27. Sep 2020 21:14


FreePascal läuft, Delphi crasht. Finde die Ursache nicht.
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe für Windows eine 32-Bit-DLL. Kurioserweise habe ich für die Exporte nur eine Lazarus/FreePascal-Headerdatei. Die Unit begann mit folgendem:

Delphi-Quellcode:
{$IFDEF FPC}
  {$MODE objfpc}
  {$PACKENUM 4} // GCC on x86 enums have size of 4 bytes
  {$PACKRECORDS C}
{$ELSE}
  {$ALIGN 4}
{$ENDIF}
{$H+}
Ist das schon einmal korrekt? Ich habe keine Ahnung. Der Quelltext enthält mehrere wilde Typen (Variante Records, Records mit Bitfeldern, Variablen aus einer DLL laden, ...).

Ich habe hier im Anhang einmal ein "Minimalbeispiel" in welchem sich FreePascal und Delphi-Konsolenanwendung den Quelltext teilen. FreePascal läuft durch, Delphi hat immer eine Access Violation an der gleichen Stelle.

Uwe Raabe 27. Sep 2020 21:51

AW: FreePascal läuft, Delphi crasht. Finde die Ursache nicht.
 
Vielleicht hilft ja ein MINENUMSIZE: Mindestgröße für Enum-Typen

TiGü 28. Sep 2020 08:49

AW: FreePascal läuft, Delphi crasht. Finde die Ursache nicht.
 
Vielleicht wirkt mein Kaffee noch nicht, aber zwischen C-Struct und Delpi/FreePascal TBitFields record sehe ich so auf den ersten Blick schon ein paar Unterschiede bzw. entstehen bei mir Fragezeichen im Kopf?

Bspw. kommt im Pascal-Record an zweiter Stelle die Definition des varianten Records und in C-Struct direkt die Werte
Delphi-Quellcode:
id, index (UInt16)
.
Wenn das index nun TMyEnum symbolisieren soll, dann prüfe mal Uwes Ratschlag mit der Enum-Größe. Dein TMyEnum sollte dann als UInt16-Wert behandelt werden (
Delphi-Quellcode:
{$MINENUMSIZE 2}
).

Des Weiteren ein prop1 (UInt32). Unter der Annahme, dass prop1 mit UInt32 den varianten Teil mit
Delphi-Quellcode:
id : record case UINT_PTR of usw.
darstellen soll, solltest du hier ein scharfes Auge drauf werfen, ob das alles so richtig ist.

Auch gibt es im C-Struct am Ende ein
Delphi-Quellcode:
MyStruct *list;
, was ich im Pascal-Record komplett vermisse (und/oder nicht verstehe).

Ggf. noch mal selbst mit der Hand das C-Struct übersetzen, so wie du es als richtig empfindest?

Der schöne Günther 28. Sep 2020 09:22

AW: FreePascal läuft, Delphi crasht. Finde die Ursache nicht.
 
Danke, MinEnumSize mit 2 hatte ich nicht probiert, ich dachte das müsste 4 groß sein.

Ich setze mich gleich auch noch einmal von vorne bis hinten dran, aber ich sehe halt dass es in FreePascal einwandfrei läuft und in Delphi zusammenbricht. Auch das jeweilige sizeof(..) für die Records war in Delphi und FPC identisch. Ich kann mit Lazarus nicht umgehen, aber soweit ich konnte hatte ich auch die Bytes im Speicher verglichen und die waren, soweit keine Zeiger im Spiel waren, auch identisch.

Vielleicht gibt es bei Aufrufkonventionen noch Unterschiede? Die Methode welche die AV wirft hat eine Menge Parameter und ist explizit als
Delphi-Quellcode:
cdecl
deklariert.

PS: Ich prüfe gleich auch einmal wie es sich unter 64 Bit verhält und schaue mir alles mit PAnsiChar noch einmal genauer an...

CCRDude 28. Sep 2020 16:12

AW: FreePascal läuft, Delphi crasht. Finde die Ursache nicht.
 
Wo kommt das "id2" in Deinem record her? "prop1" bis "code" (zusammen 32 bit) sind doch in Deinem "flags" (UInt32), und danach sollte schon der Pointer kommen?
(Und ein "size" vor "index" sehe ich in C auch nicht, sollte das die Differenz zwischen 2- und 4-Byte-Enum kompensieren?)

Der schöne Günther 28. Sep 2020 17:12

AW: FreePascal läuft, Delphi crasht. Finde die Ursache nicht.
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe mal ein FPC und ein Delphi-Konsolenprogramm erstellt. Beide teilen sich die Units. FPC läuft ohne Absturz, in Delphi kommt nachvollziehbar an der gleichen Stelle (mit gleicher Adresse) eine AV.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:55 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