Wie ich jedoch Einfluss darauf nehmen kann was mir GetPropertyItem zurück liefert, entschließt sich meiner Kenntnis.
Entweder ist die Frage unscharf formuliert oder du musst gedanklich zwei Schritte zurückgehen.
Du entscheidest durch Angaben von Konstanten wie bspw. PropertyTagExifBrightness, welche Property du möchtest.
Die Größe des zu reservierenden Buffers entscheidet sich durch die Abfrage mit der GetPropertyItemSize.
Du muss Speicher mit der zurückgebenden Größe reservieren, weil es nämlich ein Record mit variabler Größe ist.
Dies wird durch PropertyItem.value verursacht.
PropertyItem.value ist ein Zeiger auf ein Buffer, der so groß ist wie PropertyItem.length bzw. die GetPropertyItemSize.
Reservierst du jetzt nur Speicher für das Record PropertyItem/TPropertyItem, dann ist das in vielen Fällen zuwenig.
Delphi-Quellcode:
{$EXTERNALSYM PropertyItem}
PropertyItem = record // NOT PACKED !!
id : PROPID; // ID of this property
length : ULONG; // Length of the property value, in bytes
type_ : WORD; // Type of the value, as one of TAG_TYPE_XXX
value : Pointer; // property value
end;
TPropertyItem = PropertyItem;
{$EXTERNALSYM TPropertyItem}
PPropertyItem = ^TPropertyItem;
{$EXTERNALSYM PPropertyItem}
// Das ist falsch:
var
MyPropItemPtr: PPropertyItem;
Size: UINT;
begin
GetMem(MyPropItemPtr, SizeOf(PropertyItem));
GetPropertyItem(Image, EXAMPLE_PROPERTY, SizeOf(PropertyItem), MyPropItemPtr);
// Das knallt hier früher oder später
// so wäre richtig:
Size := GetPropertyItemSize(EXAMPLE_PROPERTY);
GetMem(MyPropItemPtr, Size);
GetPropertyItem(Image, EXAMPLE_PROPERTY, Size, MyPropItemPtr);
// ... mache dein Zeug
FreeMem(MyPropItemPtr, Size);