[Gelöst] TParadox und Windows 11 24H2: Invalid Pointer Exception

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Ich934
Lazarusforum e. V.
Beiträge: 375
Registriert: So 5. Mai 2019, 16:52
OS, Lazarus, FPC: ArchLinux und Windows mit FPCUPdeluxe (L: 3.6, FPC 3.2.2)
CPU-Target: x86_64, i386
Wohnort: Bayreuth

[Gelöst] TParadox und Windows 11 24H2: Invalid Pointer Exception

Beitrag von Ich934 »

Hallo,

ich bin (mal wieder) am Verzweifeln, über ein Problem, das ich so gar nicht genau identifizieren kann. Ich habe ein Programm, welches eine Paradox-Datenbank nach SQLite konvertiert. Aktuell Lazarus 4.0.0 mit FPC 3.2.2. SQLite wird über LiteDAC realisiert, aber ist für mein Problem uninteressant. Das Programm läuf problemlos unter Linux, Windows 10 und Windows 11 < 24H2.

Bei Windows 11 24H2 erhalte ich eine Invalid Pointer Exception, wenn die Funktion First für den ersten Datensatz aufgerufen wird. Das kann ich manuell per Quellcode erzeugen oder aber auch über einen TDBNavigator. Die anderen Navigationen funktionieren.

Selbst in einem kleinen, minimal Testprogramm erhalte ich diesen Fehler. Der Fehler passiert in der Zeile 284 in der paradoxds (ist die begin Zeile):

Code: Alles auswählen

function TParadoxDataset.BookmarkValid(ABookmark: TBookmark): Boolean;
begin
  Result := Assigned(ABookmark) and (Length(ABookmark) <> 0);
end;
Ich komme hier nicht weiter. Scheinbar gibt es ein Problem mit dem TBookmark. Testprojekt hängt hier an.

Vielen Dank schon einmal.
cu tb
Dateianhänge
project1.zip
(95.29 KiB) 101-mal heruntergeladen
Zuletzt geändert von Ich934 am Mo 30. Jun 2025, 18:04, insgesamt 1-mal geändert.
Tipp für PostgreSQL: www.pg-forum.de

wp_xyz
Beiträge: 5203
Registriert: Fr 8. Apr 2011, 09:01

Re: TParadox und Windows 11 24H2: Invalid Pointer Exception

Beitrag von wp_xyz »

In dem Paket ist keine Datenbank-Datei (.px) enthalten. Und einen Button1, auf den man klicken könnte, gibt es auch nicht.

Mit einem eigenen Miniprogramm, das die BioLife-Datenbank anzeigt, finde ich, dass der Fehler in einer 32-bit-Anwendung nicht auftritt, in einer 64-bit dagegen schon.

Ich kann das Problem beheben, indem ich den Zugriff auf die Adresse der lokalen Variablen bm in InternalSetToRecord vermeide:

Code: Alles auswählen

procedure TParadoxDataset.InternalSetToRecord(Buffer: PChar);
//var
//  bm: LongWord;
begin
  if (State <> dsInsert) then begin
//    bm := PRecInfo(Buffer + FHeader^.RecordSize)^.RecordNumber;
    InternalGotoBookmark(@PRecInfo(Buffer + FHeader^.RecordSize)^.RecordNumber);
//    InternalGotoBookmark(@bm);
  end;
end;
Bestätige, dass das auch bei dir hilft. Dann nehme ich das in die Komponente auf.

Ich934
Lazarusforum e. V.
Beiträge: 375
Registriert: So 5. Mai 2019, 16:52
OS, Lazarus, FPC: ArchLinux und Windows mit FPCUPdeluxe (L: 3.6, FPC 3.2.2)
CPU-Target: x86_64, i386
Wohnort: Bayreuth

Re: TParadox und Windows 11 24H2: Invalid Pointer Exception

Beitrag von Ich934 »

Sorry, hab die DB vergessen bzw. die Tabelle. Den Button habe ich dann rausgenommen, weil es ja mit dem Navigator schon funktioniert.

Unter Windows 11 24H2 kommt der Fehler jetzt bei einer anderen Tabelle. Dafür habe ich den Fehler sofort unter Linux. Jeweils der Invalid Pointer bei der function BookmarkValid.
Dateianhänge
Ahnen.zip
(9.77 KiB) 101-mal heruntergeladen
Tipp für PostgreSQL: www.pg-forum.de

wp_xyz
Beiträge: 5203
Registriert: Fr 8. Apr 2011, 09:01

Re: TParadox und Windows 11 24H2: Invalid Pointer Exception

Beitrag von wp_xyz »

In der aktuellen Version gibt es mehrere verdächtige Type-Casts von Pointer auf LongWord - das geht in der Regel bei 64-Bit schief (weil da der Pointer 64 bit hat, Longword aber 32). Ich habe nun mal alle diese Stellen im Zusammenhang mit Bookmarks durch casts auf PtrUInt (Unsigned-Integer der immer so lang ist wie ein Pointer) ersetzt, und hoffe dass ich dabei nichts kaputt gemacht habe. Zumindest stürzt das Programm mit deiner Datenbank nun unter Windows 11 (24H2) und Manjaro Linux bei mir nicht ab.

Die geänderte Unit liegt als zip bei. Überschreibe mit der ausgepackten Datei paradoxds.pas die deiner Installation (vorher backup der Datei anlegen) und installiere das Package lazparadoxpkg neu.
Dateianhänge
paradoxds.zip
(6.81 KiB) 87-mal heruntergeladen

wp_xyz
Beiträge: 5203
Registriert: Fr 8. Apr 2011, 09:01

Re: TParadox und Windows 11 24H2: Invalid Pointer Exception

Beitrag von wp_xyz »

Nein - das ist Unsinn... Es wurden keine Pointer zu Integern gecastet, sondern untypisierte Pointer zu typisierten, und das ist ok.

Ich934
Lazarusforum e. V.
Beiträge: 375
Registriert: So 5. Mai 2019, 16:52
OS, Lazarus, FPC: ArchLinux und Windows mit FPCUPdeluxe (L: 3.6, FPC 3.2.2)
CPU-Target: x86_64, i386
Wohnort: Bayreuth

Re: TParadox und Windows 11 24H2: Invalid Pointer Exception

Beitrag von Ich934 »

Hm, interessant. Die Frage ist, warum verhält es sich so?

- Linux 64-Bit: kein Problem
- Windows 10 64-Bit: kein Problem
- Windows 11 64-Bit < 24H2: kein Problem

Erst mit 24H2 tritt das Problem auf. Also liegt der Verdacht auch nahe, dass hier von Betriebssystemseite etwas geändert wurde, was hier quer treibt.
Tipp für PostgreSQL: www.pg-forum.de

Benutzeravatar
Zvoni
Beiträge: 408
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: TParadox und Windows 11 24H2: Invalid Pointer Exception

Beitrag von Zvoni »

Was ich seltsam finde:

Code: Alles auswählen

procedure TParadoxDataset.InternalGotoBookmark(ABookmark: Pointer);
begin
  if BookmarkValid(ABookmark) then
//    SetRecNo(PLongWord(ABookmark)^);
    SetRecNo(PPtrUInt(ABookmark)^);
end;   
Ist da nicht ein "P" zuviel??? "Zeiger auf PtrUint"???

Obiger Code ruft BookmarkValid auf.
"ABookmark" ist ein raw Pointer hier, und wird an "BookmarkValid" gesendet, und dort implizit auf TBookmark gecastet?!?!?

Code: Alles auswählen

function TParadoxDataset.BookmarkValid(ABookmark: TBookmark): Boolean;
begin
  Result := Assigned(ABookmark) and (Length(ABookmark) <> 0);
end; 
Mir ist klar, das TBookmark ein TypeDef für TBytes ist (dyn. array von Bytes), aber irgendwie entzieht sich das alles meinem Verständnis.

Übrigens: Ich hab mehrere Hinweise im Netz gefunden dass für Win11-24H2 es viele "Access Violations" bei anderen Programmen gibt, die bisher immer funktioniert haben.
Scheint was mit Protected Memory zu tun zu haben, was MS mit 24H2 ausgerollt hat
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

wp_xyz
Beiträge: 5203
Registriert: Fr 8. Apr 2011, 09:01

Re: TParadox und Windows 11 24H2: Invalid Pointer Exception

Beitrag von wp_xyz »

Ich934 hat geschrieben: Mo 30. Jun 2025, 06:57 - Linux 64-Bit: kein Problem
- Windows 10 64-Bit: kein Problem
- Windows 11 64-Bit < 24H2: kein Problem
Die Aufzählung kann man noch vervollständigen mit
- Windows 11 64-Bit >= 24H2 & FPC 3.3.1: kein Problem...

Ich denke, ich konnte das Problem nun soweit umgehen, dass ich in InternalGotoBookmark das BookmarkValid gar nicht mehr aufrufe, sondern dort eine eigene Gültigkeitsprüfung anbringe, ähnlich wie es in der "paradox"-Unit von FPC gemacht wird:

Code: Alles auswählen

procedure TParadoxDataset.InternalGotoBookmark(ABookmark: Pointer);
var
  bm: LongWord;
begin
  if ABookmark <> nil then
  begin
    bm := PLongWord(ABookmark)^;
    if bm <= GetRecordCount then
      SetRecNo(bm);
  end;
end;
Es könnte natürlich sein, dass die eigentliche Ursache, warum gerade der Sprung zu Dataset.First den Fehler verursacht, damit verschleiert wird. Mal sehen...

Auf jeden Fall habe ich nun noch ein weiteres Problem gesehen: Wenn man zur Designzeit die Active-Eigenschaft des TParadoxDataset auf true setzt, stürzt die IDE mit einer Access-Violation ab. Zur Laufzeit hat man kein Problem damit.

Benutzeravatar
Zvoni
Beiträge: 408
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: TParadox und Windows 11 24H2: Invalid Pointer Exception

Beitrag von Zvoni »

wp_xyz hat geschrieben: Mo 30. Jun 2025, 09:44 Ich denke, ich konnte das Problem nun soweit umgehen, dass ich in InternalGotoBookmark das BookmarkValid gar nicht mehr aufrufe, sondern dort eine eigene Gültigkeitsprüfung anbringe, ähnlich wie es in der "paradox"-Unit von FPC gemacht wird:

Code: Alles auswählen

procedure TParadoxDataset.InternalGotoBookmark(ABookmark: Pointer);
var
  bm: LongWord;
begin
  if ABookmark <> nil then
  begin
    bm := PLongWord(ABookmark)^;
    if bm <= GetRecordCount then
      SetRecNo(bm);
  end;
end;
Frage: Hier prüfst du, ob ABookmark eine gültige Speicheradresse hat.
Du prüfst aber nicht, ob die Länge des im Hintergrund versteckten ByteArrays > 0 ist?!?!

Weiss jetzt aus dem Stegreif auch nicht mehr, ob die Adresse der Array-Variablen gleichzeitig die Adresse des ersten Elements ist, was impliziert, dass die Länge des Arrays mindestens 1 ist
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

wp_xyz
Beiträge: 5203
Registriert: Fr 8. Apr 2011, 09:01

Re: TParadox und Windows 11 24H2: Invalid Pointer Exception

Beitrag von wp_xyz »

Ja, ich habe jetzt zur Sicherheit noch einen Längencheck eingebaut. Allerdings prüfe ich auf die Länge eines LongWord als Mindestlänge, damit der Cast auf PLongWord gut geht (TBookmark ist ein TBytes-Array mit Element-Größe 1 Byte). Wahrscheinlich muss man auch BookmarkValid anpassen, denn da wird nur auf Length(Bookmark) > 0 geprüft.

Ich habe auch den auskommentierten Code in TParadoxDataset.SetBookmarkData aktiviert. Die Routine wird in meinem Testprogramm zwar nicht aufgerufen, aber es kommt mir seltsam vor, dass sie nichts in das Bookmark-Feld des Record-Buffers reinschreibt, wo hingegen das Gegenstück GetbookmarkData das Feld durchaus ausliest.

Diese Version ist in das CCR-Repository (sourceforge) hochgeladen.

Das andere Problem mit dem Active-Setzen bei Designzeit scheint mir nichts mit TParadoxDataset zu tun zu haben. Der Fehler tritt auf, weil die gepostete Tabelle persistente Felder hat. Entferne ich die persistenten Felder, kann Active auch im Design-Mode gesetzt werden. Ich meine mich zu erinnern, dass persistente felder in Lazarus schon immer Probleme gemacht haben.

Ich934
Lazarusforum e. V.
Beiträge: 375
Registriert: So 5. Mai 2019, 16:52
OS, Lazarus, FPC: ArchLinux und Windows mit FPCUPdeluxe (L: 3.6, FPC 3.2.2)
CPU-Target: x86_64, i386
Wohnort: Bayreuth

Re: TParadox und Windows 11 24H2: Invalid Pointer Exception

Beitrag von Ich934 »

Vielen Dank. Ich würde das dann auch testen, aber im CCR sehe ich da noch nichts (https://sourceforge.net/projects/lazaru ... 20DataSet/). Auch über den OPM kann ich nichts ziehen.

Schöne Grüße
Tipp für PostgreSQL: www.pg-forum.de

sstvmaster
Beiträge: 583
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 3.8
CPU-Target: 32+64bit
Wohnort: Dresden

Re: TParadox und Windows 11 24H2: Invalid Pointer Exception

Beitrag von sstvmaster »

LG Maik

Windows 10,
- Lazarus 3.8 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)


Ich934
Lazarusforum e. V.
Beiträge: 375
Registriert: So 5. Mai 2019, 16:52
OS, Lazarus, FPC: ArchLinux und Windows mit FPCUPdeluxe (L: 3.6, FPC 3.2.2)
CPU-Target: x86_64, i386
Wohnort: Bayreuth

Re: TParadox und Windows 11 24H2: Invalid Pointer Exception

Beitrag von Ich934 »

Ich danke euch!

Ich habe das jetzt installiert und getestet. Es scheint wieder so zu funktionieren, wie gedacht. Vielen Dank dafür!
Tipp für PostgreSQL: www.pg-forum.de

Antworten