AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Die Delphi-IDE Delphi 10.4 BDE Field.AsBoolean Fehler durch Änderung des Assembler-Codes
Thema durchsuchen
Ansicht
Themen-Optionen

Delphi 10.4 BDE Field.AsBoolean Fehler durch Änderung des Assembler-Codes

Ein Thema von TimWu · begonnen am 10. Jun 2020 · letzter Beitrag vom 10. Jun 2020
Antwort Antwort
TimWu

Registriert seit: 27. Okt 2016
16 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

Delphi 10.4 BDE Field.AsBoolean Fehler durch Änderung des Assembler-Codes

  Alt 10. Jun 2020, 11:29
Hallo Zusammen,

Wir haben die neue Delphi-Version 10.4 installiert. Als Datenbank-Schnittstelle verwenden wir noch zum größten Teil die BDE, sind aber dabei diese nach und nach durch FireDAC auszutauschen. Eine komplette Umstellung wird allerdings noch ein paar Monate dauern.

Das Kompilieren klappte, allerdings trat beim Ausführen ein merkwürdiger Fehler in der BDE auf. Beim Setzen eines Boolean-Fields in einer TTable auf "True" und anschließendem Post wird der folgende Fehler ausgegeben:
Code:
Erste Gelegenheit für Exception bei $74E14402. Exception-Klasse EDBEngineError mit Meldung
'Allgemeiner SQL-Fehler
[Microsoft][ODBC SQL Server Driver]Numerische Werte außerhalb des zulässigen Bereichs'.
Prozess ToolKit.exe (5716)
Wir vermuten nach einigem Debugging, dass der Fehler auf die Änderung des Kompilats der folgenden Funktion, in der Unit "Data.DB", zurückgeführt werden kann.
Delphi-Quellcode:

procedure TBooleanField.SetAsBoolean(Value: Boolean);
var
  B: WordBool; //Dies ist ein usigned short
begin
  if Value then Word(B) := 1 else Word(B) := 0;
  if FIOBuffer <> nil then
    TDBBitConverter.UnsafeFrom<WordBool>(B, FIOBuffer);
  SetData(FIOBuffer);
end;

Hex-Code 10.3

Data.DB.pas.7568: if Value then Word(B) := 1 else Word(B) := 0;
006FDFA2 84D2 test dl,dl
006FDFA4 7406 jz $006fdfac
006FDFA6 66BA0100 mov dx,$0001
006FDFAA EB02 jmp $006fdfae
006FDFAC 33D2 xor edx,edx

Hex-Code 10.4

Data.DB.pas.7610: if Value then Word(B) := 1 else Word(B) := 0;
007124D2 84D2 test dl,dl
007124D4 7405 jz $007124db
007124D6 83CAFF or edx,-$01
007124D9 EB02 jmp $007124dd
007124DB 33D2 xor edx,edx

Der Befehl "mov dx,$0001" wurde durch "or edx,-$01" ausgetauscht.
Vorher wurde also die "1" fix in die Variable geschrieben, nun wird diese mit "-1" verodert. "-1" entspricht beim Zweierkomplement "1111 1111". Da dies verodert wird steht in B in der neuen Version nicht mehr "0000 0001" sondern "1111 1111". Dies konnte auch beim Debugging eingesehen werden (1 wurde zu 65535).
Dies wird dann auch anschließend in den IOBuffer geschrieben. Hier steht dann nicht (1, 0, ...) sondern (255, 255, ...)

Dies ist unserer Meinung nach der Grund für den Fehler "Numerische Werte außerhalb des zulässigen Bereichs". Die BDE scheint den IOBuffer nicht richtig auslesen zu können. Weiter Debuggen konnten wir hier aber auch nicht, da die BDE-Funktionen in DLLs liegen.

Hat jemand eine Idee, wie wir dies korrigieren können?

Danke schonmal
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Delphi 10.4 BDE Field.AsBoolean Fehler durch Änderung des Assembler-Codes

  Alt 10. Jun 2020, 12:58
Melde das bei Emba. Evtl. gibt es ja zeitnah einen Fix.

Ansonsten stell erst auf FireDac um und dann mit einem BDE-Freien Implementierung ziehe dann auf 10.4 hoch.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Delphi 10.4 BDE Field.AsBoolean Fehler durch Änderung des Assembler-Codes

  Alt 10. Jun 2020, 14:02
Hier scheint die Typprüfung den Cast zu ignorieren und in der Codegenerierung die falsche Optimierung zu benutzen.

Denn Boolean ist True = +1 ($01) und die ByteBool/WordBool/LongBool sind True = -1 ($FF...),
aber da die Konstante "True" ein Boolean (+1) ist, wird dort bei Zuweisung auch der Wert geändert.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  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 00:38 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