AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Array of Integer und crash

Ein Thema von EWeiss · begonnen am 19. Mär 2017 · letzter Beitrag vom 27. Sep 2018
Antwort Antwort
Seite 2 von 6     12 34     Letzte »    
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.009 Beiträge
 
Delphi 12 Athens
 
#11

AW: Array of Integer und crash

  Alt 19. Mär 2017, 14:26
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#12

AW: Array of Integer und crash

  Alt 19. Mär 2017, 14:36
ok das war ein versuch da es nicht lief.
Dann kann ich mir das ja schenken

POutFrameDelay = ^TOutFrameDelay;

gruss
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#13

AW: Array of Integer und crash

  Alt 19. Mär 2017, 15:35
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..


gruss
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.009 Beiträge
 
Delphi 12 Athens
 
#14

AW: Array of Integer und crash

  Alt 19. Mär 2017, 15:38
JO läuft bei mir auch wenn ich anstelle vom realen Image eine 0 angebe.
Dann liegt der Fehler aber nicht beim SetLength , sondern an irgendeiner anderen Stelle mit Bezug auf InGifImage .
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#15

AW: Array of Integer und crash

  Alt 19. Mär 2017, 15:43
JO läuft bei mir auch wenn ich anstelle vom realen Image eine 0 angebe.
Dann liegt der Fehler aber nicht beim SetLength , sondern an irgendeiner anderen Stelle mit Bezug auf 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

Geändert von EWeiss (19. Mär 2017 um 16:07 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#16

AW: Array of Integer und crash

  Alt 19. Mär 2017, 16:20
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.
Result := GDIP_GetPropertyItem(InGifImage, PropertyID, PropertyItemSize, @PropertyItemData);

gibt 0 zurück aber in der nächsten Funktion verliert InGifImage dne vorher übergebenen Wert.

gruss

Geändert von EWeiss (19. Mär 2017 um 16:35 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.009 Beiträge
 
Delphi 12 Athens
 
#17

AW: Array of Integer und crash

  Alt 19. Mär 2017, 17:51
Warum werden die Wert verändert.
Das lässt sich anhand dieser kurzen Code-Fragmente nicht erkennen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#18

AW: Array of Integer und crash

  Alt 19. Mär 2017, 18:47
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
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
SetLength(OutFrameDelay, (InFrameCount - 1));

gruss
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.009 Beiträge
 
Delphi 12 Athens
 
#19

AW: Array of Integer und crash

  Alt 19. Mär 2017, 21:00
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#20

AW: Array of Integer und crash

  Alt 19. Mär 2017, 21:06
Die frage die da wäre welchen Buffer?

gruss
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 6     12 34     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:11 Uhr.
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