AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

[gelöst] Delphi 2010 + MD5 von File

Ein Thema von h4zZ · begonnen am 5. Okt 2009 · letzter Beitrag vom 11. Okt 2009
Antwort Antwort
h4zZ

Registriert seit: 18. Sep 2009
Ort: localhost
2 Beiträge
 
RAD-Studio 2010 Arc
 
#1

[gelöst] Delphi 2010 + MD5 von File

  Alt 5. Okt 2009, 20:36
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.
Angehängte Dateien
Dateityp: pas md5_492.pas (12,3 KB, 39x aufgerufen)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Delphi 2010 + MD5 von File

  Alt 5. Okt 2009, 20:39
Schau mal im Debugger, in welcher Zeile der Fehler auftritt
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Delphi 2010 + MD5 von File

  Alt 5. Okt 2009, 20:39
Genügt es evtl., wenn Du alle Strings als AnsiStrings und alle PChars als PAnsiChars umdeklarierst?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Fridolin Walther

Registriert seit: 11. Mai 2008
Ort: Kühlungsborn
446 Beiträge
 
Delphi 2009 Professional
 
#4

Re: Delphi 2010 + MD5 von File

  Alt 5. Okt 2009, 20:42
Das Problem liegt in der MD5Update Funktion:
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).
Fridolin Walther
"While Mr. Kim, by virtue of youth and naiveté, has fallen prey to the inexplicable need for human contact, let me step in and assure you that my research will go on uninterrupted, and that social relationships will continue to baffle and repulse me."
  Mit Zitat antworten Zitat
h4zZ

Registriert seit: 18. Sep 2009
Ort: localhost
2 Beiträge
 
RAD-Studio 2010 Arc
 
#5

Re: Delphi 2010 + MD5 von File

  Alt 5. Okt 2009, 20:59
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:

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?
  Mit Zitat antworten Zitat
Fridolin Walther

Registriert seit: 11. Mai 2008
Ort: Kühlungsborn
446 Beiträge
 
Delphi 2009 Professional
 
#6

Re: Delphi 2010 + MD5 von File

  Alt 5. Okt 2009, 21:33
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.
Fridolin Walther
"While Mr. Kim, by virtue of youth and naiveté, has fallen prey to the inexplicable need for human contact, let me step in and assure you that my research will go on uninterrupted, and that social relationships will continue to baffle and repulse me."
  Mit Zitat antworten Zitat
derdelpher

Registriert seit: 18. Sep 2009
Ort: Delphi
17 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: Delphi 2010 + MD5 von File

  Alt 11. Okt 2009, 10:22
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!
Er Der Delphin
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:28 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