Hallo,
habe soeben ein D5 Projekt auf D2009 umgestellt. Dabei habe ich erst an der
DEC-5.1 rumgefummelt, bis ich dann die
Dec-5.2 gefunden habe. Mit zwei Fehler habe ich mit zu kämpfen gehabt.
1) Zu erst waren alle Identity gleich (in der 5.2 wohl gelößt). Doch ich konnte es auch in der 5.1 zum laufen bringen, indem ich die Procedure CRCTab in eine Konstante umsetzte.
Code:
const
CRCTab : TCRCTab = (
(Poly:$000000D1; Bits:8; Init:$00000000; FInit:$00000000; Inverse:true), // CRC_8 GSM/ERR
(Poly:$00000233; Bits:10; Init:$00000000; FInit:$00000000; Inverse:true), // CRC_10 ATM/OAM Cell
(Poly:$0000080F; Bits:12; Init:$00000000; FInit:$00000000; Inverse:true), // CRC_12
(Poly:$00008005; Bits:16; Init:$00000000; FInit:$00000000; Inverse:true), // CRC_16 ARC;IBM
(Poly:$00001021; Bits:16; Init:$00001D0F; FInit:$00000000; Inverse:false), // CRC_16 CCITT ITU
(Poly:$00008408; Bits:16; Init:$00000000; FInit:$00000000; Inverse:true), // CRC_16 XModem
(Poly:$00864CFB; Bits:24; Init:$00B704CE; FInit:$00000000; Inverse:false), // CRC_24
(Poly:$9DB11213; Bits:32; Init:$FFFFFFFF; FInit:$FFFFFFFF; Inverse:true), // CRC_32
(Poly:$04C11DB7; Bits:32; Init:$FFFFFFFF; FInit:$FFFFFFFF; Inverse:true), // CRC_32CCITT
(Poly:$04C11DB7; Bits:32; Init:$FFFFFFFF; FInit:$00000000; Inverse:true) // CRC_32ZModem
);
Die Procedure CRCTab erinnerte mich an meine Assembler Zeiten vor 30 Jahren. Daten in Code zu speichern wurde nicht richtig umgesetzt. Auch sollten wohl bald Daten und Code sauber getrennt sein, so das ich es in der 5.2 für mich geändert habe.
2) Alte Daten konnte ich nicht mehr einlesen, da die Identity geändert haben. Schuld war die geänderte Erzeugung der Indentiy nun ein widestring mit 512 Bytes und damals ein ansistring mit 256 Bytes. Klar das die dann unterschiedlich sein muss. Für mich habe ich das dann so geändert:
Code:
class function TDECObject.Identity: LongWord;
var
Signature: AnsiString;
begin
Signature := AnsiString(StringOfChar(#$5A, 256 - Length(Classname)) + UpperCase(ClassName));
Result := CRC32(IdentityBase, Signature[1], Length(Signature));
end;
Da der Classname sicher ohne Fehler auf AnsiString abzubilden ist, wäre das kein Problem das so zu machen. Da aber die 5.2 mit widestring geht, sollte man dies mit einer Compilerdirektive in der Source machen. Dass man das sogar programmiertechnisch macht, um alte und neue Dateien zu lesen, ist wohl ein größere Aufwand.
Gruß
Thomas