Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Delphi 10.4 BDE Field.AsBoolean Fehler durch Änderung des Assembler-Codes (https://www.delphipraxis.net/204600-delphi-10-4-bde-field-asboolean-fehler-durch-aenderung-des-assembler-codes.html)

TimWu 10. Jun 2020 11:29

Delphi 10.4 BDE Field.AsBoolean Fehler durch Änderung des Assembler-Codes
 
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

Bernhard Geyer 10. Jun 2020 12:58

AW: Delphi 10.4 BDE Field.AsBoolean Fehler durch Änderung des Assembler-Codes
 
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.

himitsu 10. Jun 2020 14:02

AW: Delphi 10.4 BDE Field.AsBoolean Fehler durch Änderung des Assembler-Codes
 
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf