Delphi-PRAXiS
Seite 2 von 6     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Array of Integer und crash (https://www.delphipraxis.net/192085-array-integer-und-crash.html)

Uwe Raabe 19. Mär 2017 14:26

AW: Array of Integer und crash
 
Delphi-Quellcode:
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 diese kennen ich eigentlich nur noch aus Zeiten vor Einführung dynamischer Arrays.

EWeiss 19. Mär 2017 14:36

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

EWeiss 19. Mär 2017 15:35

AW: Array of Integer und crash
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1364697)
Zitat:

Zitat von EWeiss (Beitrag 1364694)
Jetzt brat mir einer nen Storch warum geht das nicht.

Funktioniert doch! Mangels weiterer Informationen habe ich das mal auf ein Minimum runter gebrochen:

Delphi-Quellcode:
program Project219;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

type
  TOutFrameDelay = array of Integer;

procedure GetGifFrameDelays(InGifImage: Cardinal; InFrameCount: Cardinal;
  var OutFrameDelay: TOutFrameDelay);
begin
  SetLength(OutFrameDelay, InFrameCount - 1);
end;

procedure Main;
var
  FrameCount: Cardinal;
  FrameDelay: TOutFrameDelay;
begin

  FrameCount := 4;

//  if GetGifFrameCount(gp.GifImage, @GuidFDT, FrameCount) = S_OK then
    If (FrameCount - 1) = 0 then
    begin
      SetLength(FrameDelay, 0);
    end else
    begin
      GetGifFrameDelays(0, FrameCount, FrameDelay);
    end;

  Writeln('OK');
end;

begin
  try
    Main;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;
end.

JO läuft bei mir auch wenn ich anstelle vom realen Image eine 0 angebe.
Hmm.. :wall:


gruss

Uwe Raabe 19. Mär 2017 15:38

AW: Array of Integer und crash
 
Zitat:

Zitat von EWeiss (Beitrag 1364748)
JO läuft bei mir auch wenn ich anstelle vom realen Image eine 0 angebe.

Dann liegt der Fehler aber nicht beim
Delphi-Quellcode:
SetLength
, sondern an irgendeiner anderen Stelle mit Bezug auf
Delphi-Quellcode:
InGifImage
.

EWeiss 19. Mär 2017 15:43

AW: Array of Integer und crash
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1364749)
Zitat:

Zitat von EWeiss (Beitrag 1364748)
JO läuft bei mir auch wenn ich anstelle vom realen Image eine 0 angebe.

Dann liegt der Fehler aber nicht beim
Delphi-Quellcode:
SetLength
, sondern an irgendeiner anderen Stelle mit Bezug auf
Delphi-Quellcode:
InGifImage
.

Scheint so nur das Problem ist alle GDIPlus aufrufe geben mir ein S_OK zurück.
Wo soll dann was falsch sein wenn der Compiler mir true zurück gibt.
Ich denke das muss ich selber suchen/Fixen.

Danke

gruss

EWeiss 19. Mär 2017 16:20

AW: Array of Integer und crash
 
Nach dem Aufruf

Delphi-Quellcode:
if GetPropertyItem(InGifImage, PropertyTagFrameDelay, PropSize, PropItem) = S_OK then
begin
Delphi-Quellcode:
function GetPropertyItem(InGifImage: Cardinal; PropertyID: ULONG; PropertyItemSize: UINT;
  var PropertyItemData: TPropertyItem): integer;
begin
  // Daten auslesen
  Result := GDIP_GetPropertyItem(InGifImage, PropertyID, PropertyItemSize, @PropertyItemData);

end;
nach begin..
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

Uwe Raabe 19. Mär 2017 17:51

AW: Array of Integer und crash
 
Zitat:

Zitat von EWeiss (Beitrag 1364757)
Warum werden die Wert verändert.

Das lässt sich anhand dieser kurzen Code-Fragmente nicht erkennen.

EWeiss 19. Mär 2017 18:47

AW: Array of Integer und crash
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1364763)
Zitat:

Zitat von EWeiss (Beitrag 1364757)
Warum werden die Wert verändert.

Das lässt sich anhand dieser kurzen Code-Fragmente nicht erkennen.

Ok dann fange ich mal an.

Delphi-Quellcode:
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;
So das war's.
nachdem die Rückgabe erfolgt ist, in
Delphi-Quellcode:
TAnimateGif.GetGifFrameDelays
nach begin

Delphi-Quellcode:
if GetPropertyItem(InGifImage, PropertyTagFrameDelay, PropSize, PropItem) = S_OK then
begin
Verändert sich der wert von InGifImage und PropSize beide haben dann den Wert 8.

Hier kracht es dann
Delphi-Quellcode:
SetLength(OutFrameDelay, (InFrameCount - 1));


gruss

Uwe Raabe 19. Mär 2017 21:00

AW: Array of Integer und crash
 
In der Doku zu GdipGetPropertyItem steht:
Zitat:

Before you call Image::GetPropertyItem, you must allocate a buffer large enough to receive that object — the size varies according to data type and value of the property item.
Diesen Schritt finde ich in deinem Code aber nicht:
Delphi-Quellcode:
  // 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
In der Folge ist der bereitgestellte Speicher für PropItem höchstwahrscheinlich nicht ausreichend und es werden wohl unkontrolliert andere Variablen überschrieben.

EWeiss 19. Mär 2017 21:06

AW: Array of Integer und crash
 
Die frage die da wäre welchen Buffer?

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:12 Uhr.
Seite 2 von 6     12 34     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz