![]() |
AW: Array of Integer und crash
Delphi-Quellcode:
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 diese kennen ich eigentlich nur noch aus Zeiten vor Einführung dynamischer Arrays.
type
TOutFrameDelay = array of Integer; POutFrameDelay = ^TOutFrameDelay; |
AW: Array of Integer und crash
ok das war ein versuch da es nicht lief.
Dann kann ich mir das ja schenken ;)
Delphi-Quellcode:
POutFrameDelay = ^TOutFrameDelay;
gruss |
AW: Array of Integer und crash
Zitat:
Hmm.. :wall: gruss |
AW: Array of Integer und crash
Zitat:
Delphi-Quellcode:
, sondern an irgendeiner anderen Stelle mit Bezug auf
SetLength
Delphi-Quellcode:
.
InGifImage
|
AW: Array of Integer und crash
Zitat:
Wo soll dann was falsch sein wenn der Compiler mir true zurück gibt. Ich denke das muss ich selber suchen/Fixen. Danke gruss |
AW: Array of Integer und crash
Nach dem Aufruf
Delphi-Quellcode:
if GetPropertyItem(InGifImage, PropertyTagFrameDelay, PropSize, PropItem) = S_OK then
begin
Delphi-Quellcode:
nach begin..
function GetPropertyItem(InGifImage: Cardinal; PropertyID: ULONG; PropertyItemSize: UINT;
var PropertyItemData: TPropertyItem): integer; begin // Daten auslesen Result := GDIP_GetPropertyItem(InGifImage, PropertyID, PropertyItemSize, @PropertyItemData); end; gibt mir InGifImage und PropSize den wert 8 zurück das kann nicht stimmen. Warum werden die Wert verändert.
Delphi-Quellcode:
Result := GDIP_GetPropertyItem(InGifImage, PropertyID, PropertyItemSize, @PropertyItemData);
gibt 0 zurück aber in der nächsten Funktion verliert InGifImage dne vorher übergebenen Wert. gruss |
AW: Array of Integer und crash
Zitat:
|
AW: Array of Integer und crash
Zitat:
Delphi-Quellcode:
So das war's.
type
PropertyTagType = ( PropertyTagTypeByte = 1, PropertyTagTypeASCII = 2, PropertyTagTypeShort = 3, PropertyTagTypeLong = 4, PropertyTagTypeRational = 5, PropertyTagTypeUndefined = 7, PropertyTagTypeSLong = 9, PropertyTagTypeSRational = 10 ); TPropertyTagType = PropertyTagType; PropertyItem = record id : PROPID; length : ULONG; type_ : TPropertyTagType; value : Pointer; end; TPropertyItem = PropertyItem; PPropertyItem = ^TPropertyItem; const PropertyTagFrameDelay: ULONG = $5100; FrameDimensionTime: TGUID = '{6aedbd6d-3fb5-418a-83a6-7f45229dc872}'; // Start! //####################################### AnimateGif := TAnimateGif.Create(nil); constructor TAnimateGif.Create(AOwner: TComponent); begin LoadGif; end; procedure TAnimateGif.LoadGif; var FrameCount: UINT; FrameDelay: TOutFrameDelay; begin FrameCount := 0; if GetGifFrameCount(gp.GifImage, FrameCount) = S_OK then begin If (FrameCount - 1) = 0 then begin SetLength(FrameDelay, 0); end else begin GetGifFrameDelays(gp.GifImage, FrameCount, FrameDelay); end; end; end; function TAnimateGif.GetGifFrameCount(GifImage: Cardinal; var OutFrameCount: UINT): integer; begin Result := GDIP_ImageGetFrameCount(GifImage, @FrameDimensionTime, OutFrameCount); end; procedure TAnimateGif.GetGifFrameDelays(InGifImage: Cardinal; InFrameCount: UINT; var OutFrameDelay: TOutFrameDelay); var PROP: TProp; PropCount: integer; Size: integer; PropSize: UINT; PropItem: TPropertyItem; begin Size := 0; // Datengröße vom EXIF-Tag // "PropertyTagFrameDelay" ermitteln if GDIP_GetPropertyItemSize(InGifImage, PropertyTagFrameDelay, PropSize) = S_OK then begin // Daten auslesen if GetPropertyItem(InGifImage, PropertyTagFrameDelay, PropSize, PropItem) = S_OK then begin // PropertyTyp ermitteln case PropItem.type_ of PropertyTagTypeByte: Size := 1; PropertyTagTypeShort: Size := 2; PropertyTagTypeLong: Size := 4; end; // Array zur Aufnahme der // Pausenzeiten dimensionieren SetLength(OutFrameDelay, (InFrameCount - 1)); end; end; end; function TAnimateGif.GetPropertyItem(InGifImage: Cardinal; PropertyID: ULONG; PropertyItemSize: UINT; var PropertyItemData: TPropertyItem): integer; begin // Daten auslesen Result := GDIP_GetPropertyItem(InGifImage, PropertyID, PropertyItemSize, @PropertyItemData); end; // API //####################################### function GDIP_GetPropertyItem(image: Cardinal; propId: PROPID; propSize: UINT; buffer: PPROPERTYITEM): integer; stdcall; external dllfile; function GDIP_GetPropertyItem(Img: Cardinal; propId: PROPID; propSize: UINT; var buffer: PPROPERTYITEM): GPSTATUS; stdcall; begin result := GdipGetPropertyItem(Img, propId, propSize, buffer); end; function GdipGetPropertyItem( image: Cardinal; propId: PROPID; propSize: UINT; var buffer: PPROPERTYITEM ): GPSTATUS; stdcall; external LibGdiPlus; nachdem die Rückgabe erfolgt ist, in
Delphi-Quellcode:
nach begin
TAnimateGif.GetGifFrameDelays
Delphi-Quellcode:
Verändert sich der wert von InGifImage und PropSize beide haben dann den Wert 8.
if GetPropertyItem(InGifImage, PropertyTagFrameDelay, PropSize, PropItem) = S_OK then
begin Hier kracht es dann
Delphi-Quellcode:
SetLength(OutFrameDelay, (InFrameCount - 1));
gruss |
AW: Array of Integer und crash
In der Doku zu GdipGetPropertyItem steht:
Zitat:
Delphi-Quellcode:
In der Folge ist der bereitgestellte Speicher für PropItem höchstwahrscheinlich nicht ausreichend und es werden wohl unkontrolliert andere Variablen überschrieben.
// Datengröße vom EXIF-Tag
// "PropertyTagFrameDelay" ermitteln if GDIP_GetPropertyItemSize(InGifImage, PropertyTagFrameDelay, PropSize) = S_OK then begin // Daten auslesen if GetPropertyItem(InGifImage, PropertyTagFrameDelay, PropSize, PropItem) = S_OK then begin |
AW: Array of Integer und crash
Die frage die da wäre welchen Buffer?
gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:05 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz