![]() |
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:
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.
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)
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 |
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. |
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 08:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz