Danke, das funktioniert tatsächlich. Warum muss Lblob.pbData dereferenziert werden? Was übersehe ich?
procedure Move(const Source; var Dest; Count: NativeInt);
Wie du siehst sind für Source und Dest keine Datentypen angegeben.
Was dort intern passiert ist, dass in der Wahrheit immer ein Pointer dessen übergeben wird was du als Parameter angibst.
Im Prinzip wird bei Source und Dest ein unsichtbares "@" vor den übergebenen Wert gesetzt.
Das hier:
Move(ACertStr[1], Lblob.pbData^, Lblob.cbData)
ist unter der Haube letztendlich
Move(@ACertStr[1], @(Lblob.pbData^), Lblob.cbData) // Was wirklich übergeben wird
D.h. wenn du bei Lblob.pbData das ^ weglässt schreibt er die Daten nach @Lblob.pbData, was den Inhalt des Pointers selbst überschreibt statt den Speicher auf den der Pointer zeigt.
Durch das dereferenzieren bekommst du dann quasi sowas @(Lblob.pbData^) was sich wieder ausgleicht und ausgewertet Lblob.pbData ergibt wodurch dann tatsächlich dahin geschrieben wird, wo der Pointer hinzeigt, statt den Pointer selbst zu überschreiben.
Ich hoffe das war halbwegs verständlich (Erklären ist nicht immer so einfach
)
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."