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.