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 3 von 6     123 45     Letzte »    
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#21

AW: Array of Integer und crash

  Alt 19. Mär 2017, 22:08
PropItem
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#22

AW: Array of Integer und crash

  Alt 19. Mär 2017, 22:16
Delphi-Quellcode:
  PropertyItem = record
    id : PROPID;
    length : ULONG;
    type_ : TPropertyTagType;
    value : Pointer;
  end;
  TPropertyItem = PropertyItem;
  PPropertyItem = ^TPropertyItem;

PropItem: TPropertyItem;
Was für einen buffer soll ich da allokieren ?
Die größe bzw. der Inhalt wird doch von der GdipGetPropertyItem zurück gegeben.

gruss
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#23

AW: Array of Integer und crash

  Alt 19. Mär 2017, 22:27
Ich habe den Fehler ??? gefunden.
In wie weit das ein fehler ist könnte mir mal bitte jemand erklären.

Wenn man jetzt hier schaut

Delphi-Quellcode:
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;
kann man sehen das ich das PropItem hier deklariert habe.

PropItem: TPropertyItem;

Diese habe ich nun herausgenommen und in meine Classe gesteckt.

Delphi-Quellcode:
  TAnimateGif = class(TComponent)
  private
    FSelectedIndex: Integer;
    PropItem: TPropertyItem;
Jetzt sag mir mal jemand warum das so ein Problem verursacht hat das es nach
Delphi-Quellcode:
    if GetPropertyItem(GifImage, PropertyTagFrameDelay, PropSize, PropItem) = S_OK then
    begin
jedes Mal gekracht hat und alle Variablen sich verändert haben.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Array of Integer und crash

  Alt 19. Mär 2017, 22:31
Was für einen buffer soll ich da allokieren ?
Die größe bzw. der Inhalt wird doch von der GdipGetPropertyItem zurück gegeben.
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?

Delphi-Quellcode:
  if GDIP_GetPropertyItemSize(InGifImage, PropertyTagFrameDelay, PropSize) = S_OK then
  begin
    if PropSize <> Sizeof(PropItem) then
      { hier stimmt was nicht! }
    // Daten auslesen
    if GetPropertyItem(InGifImage, PropertyTagFrameDelay, PropSize, PropItem) = S_OK then
Was deinen Fix angeht: ich fürchte, du hast immer noch den Fehler drin, er äußert sich jetzt vermutlich nur anders weil andere Variablen überschrieben werden. Hier gilt immer noch die goldene Regel: Wenn du nicht verstehst, warum eine Änderung den Fehler behebt, dann hast du ihn wahrscheinlich auch nicht behoben.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#25

AW: Array of Integer und crash

  Alt 19. Mär 2017, 22:37
Zitat:
Was deinen Fix angeht: ich fürchte, du hast immer noch den Fehler drin, er äußert sich jetzt vermutlich nur anders weil andere Variablen überschrieben werden. Hier gilt immer noch die goldene Regel: Wenn du nicht verstehst, warum eine Änderung den Fehler behebt, dann hast du ihn wahrscheinlich auch nicht behoben.
Möglich da ich wirklich nicht weiß warum dieser das Problem behoben hat.
Ich denke mal das er einfach global deklariert werden muss damit die Daten nicht überschrieben werden.

Ich habe das geprüft und die Daten kommen alle richtig an.

EDIT:
Propsize = 72
SizeOf = 16
PropItem.Length = 56

Hmmmm


gruss

Geändert von EWeiss (11. Jul 2019 um 16:46 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Array of Integer und crash

  Alt 19. Mär 2017, 22:54
Ich denke mal das er einfach global deklariert werden muss damit die Daten nicht überschrieben werden.
Wohl eher: damit andere Daten überschrieben werden.

Ich habe das geprüft und die Daten kommen alle richtig an.

EDIT:
Propsize = 72
SizeOf = 16
PropItem.Length = 56
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 zeigt.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#27

AW: Array of Integer und crash

  Alt 19. Mär 2017, 22:58
Ich denke mal das er einfach global deklariert werden muss damit die Daten nicht überschrieben werden.
Wohl eher: damit andere Daten überschrieben werden.

Ich habe das geprüft und die Daten kommen alle richtig an.

EDIT:
Propsize = 72
SizeOf = 16
PropItem.Length = 56
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 zeigt.
Sorry ich weis jetzt nicht was du meinst wie soll ich dem Record einen Speicher zuweisen.
Oder was meinst du genau.

Danke für deine Hilfe hab da echt ein Verständnis Problem.
gruss
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Array of Integer und crash

  Alt 19. Mär 2017, 23:09
Sorry ich weis jetzt nicht was du meinst wie soll ich dem Record einen Speicher zuweisen.
Das kannst du so gar nicht. Deswegen wird in den Beispielen auch immer ein dynamischer Pointer PPropertyIem benutzt, der entsprechend PropSize alloziert wird.

Delphi-Quellcode:
   PropSize: UINT;
   PropItem: PPropertyItem; // dynamischer Pointer auf Record


  if GDIP_GetPropertyItemSize(InGifImage, PropertyTagFrameDelay, PropSize) = S_OK then
  begin
    GetMem(PropItem, PropSize); // Record in passender Größe bereitstellen
    // Daten auslesen
    if GetPropertyItem(InGifImage, PropertyTagFrameDelay, PropSize, PropItem^) = S_OK then // Alternativ den Typ des Parameters in PPropertyItem ändern
    ...
    FreeMem(PropItem); // Delphi merkt sich die Size intern
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#29

AW: Array of Integer und crash

  Alt 19. Mär 2017, 23:13
Zitat:
Das kannst du so gar nicht. Deswegen wird in den Beispielen auch immer ein dynamischer Pointer PPropertyIem benutzt, der entsprechend PropSize alloziert wird.
Jo das meinte ich doch Danke.

So wie du sagst es gibt immer noch Probleme eigentlich müsste ich als Ergebnis für jedes Frame 80 MS Wartezeit haben.
Die sind aber nicht richtig da die Daten durcheinander sind die Ankommen.

Danke werde mal das Memory so allokieren wie du gezeigt hast.

gruss
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#30

AW: Array of Integer und crash

  Alt 19. Mär 2017, 23:30
Es geht nicht wirklich musste es ändern da sich die Typen nicht vertragen haben.

TProp musste ich umdefinieren..
  TProp = array of Byte;
Delphi-Quellcode:
var
  p: Pointer;
//###############
// Bytearray dimensionieren
p := @PropItem;
GetMem(p, PropSize);

SetLength(Prop, (PropItem.length - 1));
CopyMemory(@Prop[0], @PropItem.value, PropItem.length);

FreeMem(p);
Hab irgendwo ein denk Fehler.
Die Einträge nach meinem Verständnis müssten eigentlich so aussehen
8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0

Sehen aber aus wie im Bild gezeigt.
Irgendwas stimmt noch nicht. (Ein durcheinander)
NA ja hab mich noch nicht wirklich mit dem GIF Kram auseinandergesetzt.


gruss

Geändert von EWeiss (11. Jul 2019 um 16:46 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 6     123 45     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 11:23 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