Ich denke mal das er einfach global deklariert werden muss damit die Daten nicht überschrieben werden.
Wohl eher: damit andere Daten überschrieben werden.
Ich habe das geprüft und die Daten kommen alle richtig an.
EDIT:
Propsize = 72
SizeOf = 16
PropItem.Length = 56
Daraus schließe ich, daß jetzt die ersten 56 Byte hinter dem PropItem Feld überschrieben werden. Deklariere dort doch zum Test mal einen entsprechend großen Bereich, initialisiere ihn (sollte sowieso alles 0 sein) und schau nach, was nach dem Aufruf drin steht. Würde mich auch nicht wundern, wenn der Value-Pointer genau auf diesen Bereich zeigt.