Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi [gelöst] Delphi 2010 + MD5 von File (https://www.delphipraxis.net/141252-%5Bgeloest%5D-delphi-2010-md5-von-file.html)

h4zZ 5. Okt 2009 20:36


[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:
MD5Print(MD5File('Test.txt'))
nicht mehr.

Ich bekomme folgenden Error:
Code:
Zugriffsverletzung bei Adresse 004A9394 in Modul 'Project1.exe'. Lesen von Adresse 02D61000
Ich vermute es liegt bei der MD5 Unit an dem dynamischen Arrays bzw. SizeOf.

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.

mkinzler 5. Okt 2009 20:39

Re: Delphi 2010 + MD5 von File
 
Schau mal im Debugger, in welcher Zeile der Fehler auftritt

DeddyH 5. Okt 2009 20:39

Re: Delphi 2010 + MD5 von File
 
Genügt es evtl., wenn Du alle Strings als AnsiStrings und alle PChars als PAnsiChars umdeklarierst?

Fridolin Walther 5. Okt 2009 20:42

Re: Delphi 2010 + MD5 von File
 
Das Problem liegt in der MD5Update Funktion:
Delphi-Quellcode:
procedure MD5Update(var Context: MD5Context; Input: pChar; Length: longword);
Änder dort den Input Parameter in pAnsiChar (sowohl im interface als auch im implementation Teil der Unit).

h4zZ 5. Okt 2009 20:59

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:
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(MD5Print(MD5File('Test.txt')));
end;
und er zeigt mir den MD5 Wert an.

Allerdings in meiner FTP Funktion funktioniert es nicht:

EDIT:

FTP Thread entfernt und Lösung gefunden.

Zitat:

Autor: Fridolin Walther
Das Problem liegt in der MD5Update Funktion:

Delphi-Quellcode:
procedure MD5Update(var Context: MD5Context; Input: pChar; Length: longword);

Änder dort den Input Parameter in pAnsiChar (sowohl im interface als auch im implementation Teil der Unit).
DANKE! Es geht! Habe dein Edit erst jetzt gesehen.. Kannst du mir vielleicht auch den Hintergrund nennen, wieso es nur mit pAnsiChar geht?

Fridolin Walther 5. Okt 2009 21:33

Re: Delphi 2010 + MD5 von File
 
Zitat:

Zitat von h4zZ
DANKE! Es geht! Habe dein Edit erst jetzt gesehen.. Kannst du mir vielleicht auch den Hintergrund nennen, wieso es nur mit pAnsiChar geht?

Vor Delphi 2009 was PChar gleichbedeutend mit PAnsiChar. Mit Delphi 2009 und der Umstellung auf Unicode ist PChar jetzt ein PWideChar.

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:
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;
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.

derdelpher 11. Okt 2009 10:22

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 14:40 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