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 4 von 6   « Erste     234 56      
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

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

AW: Array of Integer und crash

  Alt 19. Mär 2017, 23:32
Versuch doch mal so (value ist doch ein Pointer auf den Datenbereich):

CopyMemory(@Prop[0], PropItem.value, PropItem.length);
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#32

AW: Array of Integer und crash

  Alt 19. Mär 2017, 23:35
Versuch doch mal so (value ist doch ein Pointer auf den Datenbereich):

CopyMemory(@Prop[0], PropItem.value, PropItem.length);
Geht auch ohne Pointer aber die Daten sind immer noch durcheinander.

gruss

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

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

AW: Array of Integer und crash

  Alt 19. Mär 2017, 23:47
Das sieht aber immer noch nicht so aus, wie ich das gezeigt hatte:

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);

So sollte es auch mit dem Prop-Array gehen:

Delphi-Quellcode:
   PropSize: UINT;
   PropItem: PPropertyItem; // dynamischer Pointer auf Record, deswegen PPropertyItem und nicht TPropertyItem


  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 begin
      SetLength(Prop, PropItem.length); // nix -1 !!!
      CopyMemory(@Prop[0], PropItem.value, PropItem.length);
      ...
    end;
    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
 
#34

AW: Array of Integer und crash

  Alt 19. Mär 2017, 23:58
Das sieht aber immer noch nicht so aus, wie ich das gezeigt hatte:

Sorry das mit GetMem funktioniert nicht.
GetMem erwartet einen Pointer PropItem ist aber als TPropertyItem definiert.
Was aber korrekt ist ich muss den Speicher vor GetPropertyItem allokieren ich habe es nachher gemacht.


EDIT:
OK hab dich verstanden funktioniert jetzt
Danke für deine Mühe und Zeit.
Habe wieder einiges gelernt.

So soll es sein das Ergebniss.. jedes Frame läuft 80ms.
Hier nochmal das gesamt Ergebnis vielleicht kann es ja mal jemand brauchen.

Delphi-Quellcode:
procedure TAnimateGif.GetGifFrameDelays(GifImage: Cardinal; FrameCount: UINT;
  var FrameDelay: TFrameDelay);
var
  ISize: integer;
  PropSize: UINT;
  Prop: TProp;
  PropCount: integer;
begin

  ISize := 0;

  // Datengröße vom EXIF-Tag PropertyTagFrameDelay ermitteln
  if GDIP_GetPropertyItemSize(GifImage, PropertyTagFrameDelay, PropSize) = S_OK then
  begin
    // Speicher allokieren
    GetMem(PropItem, PropSize);
    
    // Daten auslesen
    if GetPropertyItem(GifImage, PropertyTagFrameDelay, PropSize, PropItem) = S_OK then
    begin
      // Bytearray dimensionieren
      SetLength(Prop, (PropItem.length + 1));
      CopyMemory(@Prop[0], PropItem.value, PropItem.length);

      // PropertyTyp ermitteln
      case PropItem.type_ of
        PropertyTagTypeByte:
          ISize := 1;

        PropertyTagTypeShort:
          ISize := 2;

        PropertyTagTypeLong:
          ISize := 4;
      end;

      // Array zur Aufnahme der Pausenzeiten dimensionieren
      SetLength(FrameDelay, FrameCount);
      // Pausenzeiten der einzelnen Bilder aus Bytearray kopieren
      for PropCount := 0 to (FrameCount - 1) do
      begin
        CopyMemory(@FrameDelay[PropCount], @Prop[PropCount * ISize], ISize);
        FrameDelay[PropCount] := FrameDelay[PropCount] * 10;
      end;
    end;
    FreeMem(PropItem);
  end;

end;
gruss

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

n/a Beiträge
 
#35

AW: Array of Integer und crash

  Alt 26. Sep 2018, 14:28
Muss das nochmal aufgreifen..

Habe das Projekt nach 64 Bit umgelegt bekomme aber jetzt fortlaufend "Inaccessible value"
Delphi-Quellcode:
function TAnimateGif.GetPropertyItem(GifImage: LONG_PTR; PropertyID: ULONG; PropertyItemSize: UINT;
  var PropertyItemData: PPropertyItem): GPSTATUS;
begin

  // Daten auslesen
  Result := GDIP_GetPropertyItem(GifImage, PropertyID, PropertyItemSize, PropertyItemData);
end;
Delphi-Quellcode:
function GDIP_GetPropertyItem(Img: LONG_PTR; propId: PROPID; propSize: UINT;
  var buffer: PPROPERTYITEM
): GPSTATUS; stdcall;
begin

  result := GdipGetPropertyItem(Img, propId, propSize, buffer);
end;
bevor GdipGetPropertyItem aufgerufen wird ist der Buffer gefüllt.
Nach dem Aufruf von GdipGetPropertyItem ist der buffer Inaccessible.

Wie immer tritt nur unter 64 Bit auf.

Die Funktion ist diese.
GdipGetPropertyItem: function(Image: LONG_PTR; propId: PROPID; propSize: UINT; var buffer: PPROPERTYITEM): GPSTATUS; stdcall;

Und der Record der..
Delphi-Quellcode:
  PropertyItem = record // NOT PACKED !!
    id : PROPID; // ID of this property
    length : ULONG; // Length of the property value, in bytes
    type_ : WORD; // Type of the value, as one of TAG_TYPE_XXX
    value : Pointer; // property value
  end;
  TPropertyItem = PropertyItem;
  PPropertyItem = ^TPropertyItem;
es kracht dann hier
Delphi-Quellcode:
    // Daten auslesen
    if GetPropertyItem(GifImage, PropertyTagFrameDelay, PropSize, FPropItem) = OK then
    begin
      // Bytearray dimensionieren
      SetLength(Prop, PropItem.Length);
      CopyMemory(@Prop[0], PropItem.value, PropItem.Length);
weil PropItem bzw. vorher schon PropertyItemData nicht zugänglich ist.

PS:
Es hat nichts mit dem setzen der Optimierung zu tun!

gruss
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#36

AW: Array of Integer und crash

  Alt 26. Sep 2018, 15:11
Delphi-Quellcode:
    // Daten auslesen
    if GetPropertyItem(GifImage, PropertyTagFrameDelay, PropSize, FPropItem) = OK then
    begin
      // Bytearray dimensionieren
      SetLength(Prop, PropItem.Length);
      CopyMemory(@Prop[0], PropItem.value, PropItem.Length);
Du füllst FPropItem und greifst dann auf PropItem (ohne F) zu.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#37

AW: Array of Integer und crash

  Alt 26. Sep 2018, 15:15
Delphi-Quellcode:
    // Daten auslesen
    if GetPropertyItem(GifImage, PropertyTagFrameDelay, PropSize, FPropItem) = OK then
    begin
      // Bytearray dimensionieren
      SetLength(Prop, PropItem.Length);
      CopyMemory(@Prop[0], PropItem.value, PropItem.Length);
Du füllst FPropItem und greifst dann auf PropItem (ohne F) zu.
FPropItem ist nicht zugänglich. (Inaccessible)
Und ja das gleiche tue ich auch unter 32 Bit ohne Probleme..

Danke.
Der Fehler den ich bekomme ist EInOutError..

zudem es ist ein Property
property PropItem: PPropertyItem read FPropItem write FPropItem;

FPropItem liest und weist das Result PropItem zu beide haben also den gleichen Wert.

gruss

Geändert von EWeiss (26. Sep 2018 um 15:57 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#38

AW: Array of Integer und crash

  Alt 26. Sep 2018, 15:20
Reservierst du denn vorher Speicher von der Größe, die dir GdipGetPropertyItemSize liefert, für deine Membervariable FPropItem bzw. für das dahinterliegende Record?
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#39

AW: Array of Integer und crash

  Alt 26. Sep 2018, 15:23
Reservierst du denn vorher Speicher von der Größe, die dir GdipGetPropertyItemSize liefert, für deine Membervariable FPropItem bzw. für das dahinterliegende Record?
Ja..
Delphi-Quellcode:
  // Datengröße vom EXIF-Tag PropertyTagFrameDelay ermitteln
  if GDIP_GetPropertyItemSize(GifImage, PropertyTagFrameDelay, PropSize) = OK then
  begin
    // Speicher allokieren
    GetMem(FPropItem, PropSize);
gruss
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#40

AW: Array of Integer und crash

  Alt 26. Sep 2018, 15:39
Ein kleines 20-50 Zeilenprogramm zum nachvollziehen und selber kompilieren?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 6   « Erste     234 56      


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 22:22 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