AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi FreePascal läuft, Delphi crasht. Finde die Ursache nicht.

FreePascal läuft, Delphi crasht. Finde die Ursache nicht.

Ein Thema von Der schöne Günther · begonnen am 27. Sep 2020 · letzter Beitrag vom 28. Sep 2020
Antwort Antwort
Der schöne Günther

Registriert seit: 6. Mär 2013
6.167 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

FreePascal läuft, Delphi crasht. Finde die Ursache nicht.

  Alt 27. Sep 2020, 21:14
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.
Angehängte Dateien
Dateityp: zip FPC_vs_Delphi.zip (943,3 KB, 3x aufgerufen)

Geändert von Der schöne Günther (28. Sep 2020 um 17:15 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: FreePascal läuft, Delphi crasht. Finde die Ursache nicht.

  Alt 27. Sep 2020, 21:51
Vielleicht hilft ja ein MINENUMSIZE: Mindestgröße für Enum-Typen
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: FreePascal läuft, Delphi crasht. Finde die Ursache nicht.

  Alt 28. Sep 2020, 08:49
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 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 ({$MINENUMSIZE 2} ).

Des Weiteren ein prop1 (UInt32). Unter der Annahme, dass prop1 mit UInt32 den varianten Teil mit 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 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?

Geändert von TiGü (28. Sep 2020 um 08:52 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.167 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: FreePascal läuft, Delphi crasht. Finde die Ursache nicht.

  Alt 28. Sep 2020, 09:22
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 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...
  Mit Zitat antworten Zitat
CCRDude

Registriert seit: 9. Jun 2011
678 Beiträge
 
FreePascal / Lazarus
 
#5

AW: FreePascal läuft, Delphi crasht. Finde die Ursache nicht.

  Alt 28. Sep 2020, 16:12
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?)

Geändert von CCRDude (28. Sep 2020 um 16:30 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.167 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: FreePascal läuft, Delphi crasht. Finde die Ursache nicht.

  Alt 28. Sep 2020, 17:12
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.
Angehängte Dateien
Dateityp: zip FPC_vs_Delphi.zip (943,3 KB, 7x aufgerufen)

Geändert von Der schöne Günther (28. Sep 2020 um 17:14 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 00:31 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