![]() |
[gelöst] Delphi 2010 + MD5 von File
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo liebe Delphi Gemeinde,
bisher war ich eher der passiv Leser und konnte durch Google und die Forensuche alle meine Probleme lösen. Jetzt bin ich leider an einem Punkt, wo ich einfach keine Lösung mehr finde. Wahrscheinlich ist Delphi 2010 noch zu neu und noch nicht alle haben sich damit intensiv befasst. Folgendes: Ich habe ein Delphi 2007 Projekt wo ich die MD5 Unit von Fichtner verwende auf Delphi 2010 konvertiert. Dort funktioniert leider die Zeile:
Code:
nicht mehr.
MD5Print(MD5File('Test.txt'))
Ich bekomme folgenden Error:
Code:
Ich vermute es liegt bei der MD5 Unit an dem dynamischen Arrays bzw. SizeOf.
Zugriffsverletzung bei Adresse 004A9394 in Modul 'Project1.exe'. Lesen von Adresse 02D61000
Weiß einer Rat wo und was ich bei dieser MD5 Unit ändern muss, damit sie auch unter Delphi 2010 funktioniert? Im Anhang habe ich die MD5 Unit angehangen, damit ihr sie nicht suchen braucht. |
Re: Delphi 2010 + MD5 von File
Schau mal im Debugger, in welcher Zeile der Fehler auftritt
|
Re: Delphi 2010 + MD5 von File
Genügt es evtl., wenn Du alle Strings als AnsiStrings und alle PChars als PAnsiChars umdeklarierst?
|
Re: Delphi 2010 + MD5 von File
Das Problem liegt in der MD5Update Funktion:
Delphi-Quellcode:
Änder dort den Input Parameter in pAnsiChar (sowohl im interface als auch im implementation Teil der Unit).
procedure MD5Update(var Context: MD5Context; Input: pChar; Length: longword);
|
Re: Delphi 2010 + MD5 von File
Ich habe jetzt ein wenig rumprobiert und auch Fridolin Walthers Ansatz getestet. Fehler blieb.
Dann habe ich ganz einfach mal ein Button Klick Event gemacht mit:
Delphi-Quellcode:
und er zeigt mir den MD5 Wert an.
procedure TForm1.Button1Click(Sender: TObject);
begin ShowMessage(MD5Print(MD5File('Test.txt'))); end; Allerdings in meiner FTP Funktion funktioniert es nicht: EDIT: FTP Thread entfernt und Lösung gefunden. Zitat:
|
Re: Delphi 2010 + MD5 von File
Zitat:
Dadurch das ein WideChar aber 2 Byte groß ist, ein AnsiChar aber nur 1, verändert sich die Pointer Arithmetik. Wenn Du einen Pointer um einen Wert inkrementierst, verschiebt sich die Adresse um die Größe des Datentyps auf den der Pointer zeigt. Bei den alten PAnsiChars bedeutet das, daß ein Inkrement um 1 die Adresse um 1 Byte erhöht hat. Ein Inkrement um 1 bedeutet beim PWideChar aber eine Adresserhöhung von 2. Wenn man sich jetzt die Funktion ansieht, sieht man einige Fälle von Pointer Arithmetik (Zeile 19 und 24):
Delphi-Quellcode:
Der von Arrays bekannte [] Operator entspricht dabei einem Inkrement mit I. Ist Input PWideChar verschiebt sich dadurch der Pointer aber nicht um I Stellen nach oben, sondern um I*2 Stellen. Das bewirkt, daß ausserhalb des eigentlichen Buffers gelesen wird und es gibt die Zugriffsverletzung. Bin grade ein wenig im Streß, daher sorry wenns ein wenig kompliziert klingen mag. Wenn ich mehr Zeit hab, lass ich mir ein etwas einfacher zu verstehendes Beispiel einfallen.
procedure MD5Update(var Context: MD5Context; Input: pAnsiChar; Length: longword);
var Index: longword; PartLen: longword; I: longword; begin with Context do begin Index := (Count[0] shr 3) and $3f; inc(Count[0], Length shl 3); if Count[0] < (Length shl 3) then inc(Count[1]); inc(Count[1], Length shr 29); end; PartLen := 64 - Index; if Length >= PartLen then begin CopyMemory(@Context.Buffer[Index], Input, PartLen); Transform(@Context.Buffer, Context.State); I := PartLen; while I + 63 < Length do begin Transform(@Input[I], Context.State); inc(I, 64); end; Index := 0; end else I := 0; CopyMemory(@Context.Buffer[Index], @Input[I], Length - I); end; |
Re: Delphi 2010 + MD5 von File
hallo!
ich habe die gleichen probleme - bin gerade auf Delphi 2010 umgestiegen... wäre es möglich die unicode-kompatible version von md5.pas hier zu posten? das wäre eine große hilfe!! vielen dank im voraus! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:43 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