Forum: Programmieren allgemein
by Uwe Raabe,
19. Mär 2017
Das sieht aber immer noch nicht so aus, wie ich das gezeigt hatte:
var
p: Pointer;
//###############
// Bytearray dimensionieren
p := @PropItem;
GetMem(p, PropSize);
Forum: Programmieren allgemein
by Uwe Raabe,
19. Mär 2017
Versuch doch mal so (value ist doch ein Pointer auf den Datenbereich):
CopyMemory(@Prop, PropItem.value, PropItem.length);
Forum: Programmieren allgemein
by Uwe Raabe,
19. Mär 2017
Das kannst du so gar nicht. Deswegen wird in den Beispielen auch immer ein dynamischer Pointer PPropertyIem benutzt, der entsprechend PropSize alloziert wird.
PropSize: UINT;
PropItem: PPropertyItem; // dynamischer Pointer auf Record
if GDIP_GetPropertyItemSize(InGifImage, PropertyTagFrameDelay, PropSize) = S_OK then
begin
GetMem(PropItem, PropSize); // Record in...
Forum: Programmieren allgemein
by Uwe Raabe,
19. Mär 2017
Wohl eher: damit andere Daten überschrieben werden.
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...
Forum: Programmieren allgemein
by Uwe Raabe,
19. Mär 2017
Schon, die Größe des Bereichs für das PropertyItem wird aber über GdipGetPropertyItemSize ermittelt.
Wenn der Speicherbereich für PropertyItem eh durch die Deklaration vorgegeben ist, warum dann die Abfrage über GDIP_GetPropertyItemSize? Kannst du mal prüfen, ob das wirklich den erwarteten Wert zurückgibt?
if GDIP_GetPropertyItemSize(InGifImage, PropertyTagFrameDelay, PropSize) = S_OK...
Forum: Programmieren allgemein
by Uwe Raabe,
19. Mär 2017
In der Doku zu GdipGetPropertyItem steht:
Diesen Schritt finde ich in deinem Code aber nicht:
// Datengröße vom EXIF-Tag
// "PropertyTagFrameDelay" ermitteln
if GDIP_GetPropertyItemSize(InGifImage, PropertyTagFrameDelay, PropSize) = S_OK then
begin
// Daten auslesen
Forum: Programmieren allgemein
by Uwe Raabe,
19. Mär 2017
Das lässt sich anhand dieser kurzen Code-Fragmente nicht erkennen.
Forum: Programmieren allgemein
by Uwe Raabe,
19. Mär 2017
Dann liegt der Fehler aber nicht beim SetLength, sondern an irgendeiner anderen Stelle mit Bezug auf InGifImage.
Forum: Programmieren allgemein
by Uwe Raabe,
19. Mär 2017
type
TOutFrameDelay = array of Integer;
POutFrameDelay = ^TOutFrameDelay;
Das mit dem Pointer-Typ habe ich auch nicht verstanden. Ein dynamisches Array ist doch intern eh schon ein Pointer auf das eigentliche Array (ähnlich wie bei class), welcher mit SetLength gesetzt wird. Durch die Deklaration als var-Parameter funktioniert dies ja auch wie erwartet. Solche Deklarations-Paare wie...
Forum: Programmieren allgemein
by Uwe Raabe,
19. Mär 2017
Funktioniert doch! Mangels weiterer Informationen habe ich das mal auf ein Minimum runter gebrochen:
program Project219;
{$APPTYPE CONSOLE}
{$R *.res}
uses
Forum: Programmieren allgemein
by Uwe Raabe,
19. Mär 2017
Liegt vielleicht daran, was dieser procedure übergeben wird?