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 5 von 6   « Erste     345 6      
EWeiss
(Gast)

n/a Beiträge
 
#41

AW: Array of Integer und crash

  Alt 26. Sep 2018, 15:53
Ein kleines 20-50 Zeilenprogramm zum nachvollziehen und selber kompilieren?
Leider nicht.
Es geht um GDIPlus alleine die Header sind schon ein paar Hundert Zeilen.

gruss
  Mit Zitat antworten Zitat
TiGü

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

AW: Array of Integer und crash

  Alt 26. Sep 2018, 15:59
Ein kleines 20-50 Zeilenprogramm zum nachvollziehen und selber kompilieren?
Leider nicht.
Es geht um GDIPlus alleine die Header sind schon ein paar Hundert Zeilen.

gruss
Kein Problem, die sind ja in jeden neueren Delphi unter Winapi.GDIPAPI mit dabei.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#43

AW: Array of Integer und crash

  Alt 26. Sep 2018, 16:04
Ein kleines 20-50 Zeilenprogramm zum nachvollziehen und selber kompilieren?
Leider nicht.
Es geht um GDIPlus alleine die Header sind schon ein paar Hundert Zeilen.

gruss
Kein Problem, die sind ja in jeden neueren Delphi unter Winapi.GDIPAPI mit dabei.
Diese sind zu meiner Engine nicht kompatibel.
Mein Header lädt die GDIPlus dynamisch und alle Funktionen basieren auf WinAPI32 nicht auf Classen.

Hmm... ist wieder so ein Problem wo ich mit einem Beispiel leider nicht dienen kann auch wenn ich es wollte.
Danke.

gruss
  Mit Zitat antworten Zitat
TiGü

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

AW: Array of Integer und crash

  Alt 26. Sep 2018, 16:24
Kein Problem, die sind ja in jeden neueren Delphi unter Winapi.GDIPAPI mit dabei.
Diese sind zu meiner Engine nicht kompatibel.
Mein Header lädt die GDIPlus dynamisch und alle Funktionen basieren auf WinAPI32 nicht auf Classen.

Hmm... ist wieder so ein Problem wo ich mit einem Beispiel leider nicht dienen kann auch wenn ich es wollte.
Danke.
Die Funktionen in Winapi.GDIPAPI sind flach und direkte WinAPI32. Nicht mit Winapi.GDIPOBJ verwechseln!

Versuche damit ein Beispielprogramm mit Initialisierung, Bild laden und das Abfragen der von dir gewünschten Funktion zu bauen.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#45

AW: Array of Integer und crash

  Alt 26. Sep 2018, 16:30
Zitat:
Diese sind zu meiner Engine nicht kompatibel.
Das Beispiel Projekt muss sich an den Richtlinien halten wie sie von meiner Library vorgegeben sind.
Ansonsten macht es keinen sinn.

Sorry nein kein Beispiel.

gruss
  Mit Zitat antworten Zitat
TiGü

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

AW: Array of Integer und crash

  Alt 26. Sep 2018, 16:39
Ggf. sind aber deine Header nicht richtig übersetzt?
Das wäre doch genau der springende Punkt.
Wenn das Beispielprojekt mit den mitgelieferten Headern geht und mit deinen nicht, dann weißt du doch wo der Fehler ist.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#47

AW: Array of Integer und crash

  Alt 26. Sep 2018, 16:51
Zitat:
Ggf. sind aber deine Header nicht richtig übersetzt?
Denke mal nicht.
Der einzige unterschied ist ich verwende LONG_PTR anstelle von Pointer für die Images.

Meine..
Delphi-Quellcode:
  GdipImageGetFrameCount: function(Image: LONG_PTR; dimensionID: PGUID; var count: UINT): GPSTATUS; stdcall;
  GdipGetPropertyItem: function(Image: LONG_PTR; propId: PROPID; propSize: UINT; var buffer: PPROPERTYITEM): GPSTATUS; stdcall;
  GdipGetPropertyItemSize: function(Image: LONG_PTR; propId: PROPID; var size: UINT): GPSTATUS; stdcall;
  GdipGetPropertyCount: function(Image: LONG_PTR; var numOfProperty: UINT): GPSTATUS; stdcall;
  GdipGetPropertyIdList: function(Image: LONG_PTR; numOfProperty: UINT; var list: PPROPID): GPSTATUS; stdcall;
Winapi.GDIPAPI
Delphi-Quellcode:
  function GdipImageGetFrameCount(image: GPIMAGE; dimensionID: PGUID;
    var count: UINT): GPSTATUS; stdcall;
  {$EXTERNALSYM GdipImageGetFrameCount}
  
  function GdipGetPropertyItem(image: GPIMAGE; propId: PROPID; propSize: UINT;
    buffer: PPROPERTYITEM): GPSTATUS; stdcall;
  {$EXTERNALSYM GdipGetPropertyItem}

  function GdipGetPropertyItemSize(image: GPIMAGE; propId: PROPID;
    var size: UINT): GPSTATUS; stdcall;
  {$EXTERNALSYM GdipGetPropertyItemSize}

  function GdipGetPropertyCount(image: GPIMAGE;
    var numOfProperty: UINT): GPSTATUS; stdcall;
  {$EXTERNALSYM GdipGetPropertyCount}

  function GdipGetPropertyIdList(image: GPIMAGE; numOfProperty: UINT;
    list: PPROPID): GPSTATUS; stdcall;
  {$EXTERNALSYM GdipGetPropertyIdList}

hmmm.. sehe gerade hier ist kein var.
var buffer: PPROPERTYITEM bei GdipGetPropertyItem (Winapi.GDIPAPI) muss das mal testen.

Zitat:
Da ist ein Fehler in der Winapi.GDIPAPI
der Buffer MUSS über var zurückgegeben werden.
Soviel zu Winapi.GDIPAPI

Was gibt er also zurück bei der Winapi.GDIPAPI bei der Funktion GdipGetPropertyItem? NICHTS!
Hier ist auch ein Fehler GdipGetPropertyIdList keine Rückgabe, sollte eigentlich den Zeiger auf das Array der Liste zurückgeben.
Sorry aber mit so was kann man nicht arbeiten.

gruss

Geändert von EWeiss (26. Sep 2018 um 17:27 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#48

AW: Array of Integer und crash

  Alt 26. Sep 2018, 17:21
Code:
DECLARE FUNCTION GdipGetPropertyIdList ( _
     BYVAL pImage AS DWORD, _
     BYVAL numOfProperty AS DWORD, _
     BYREF list AS DWORD _
 ) AS LONG

list
[out] Pointer to an array that receives the property identifiers.

DECLARE FUNCTION GdipGetPropertyItem ( _     
     BYVAL pImage AS DWORD, _
     BYVAL propId AS DWORD, _
     BYVAL propSize AS DWORD, _
     BYREF buffer AS PropertyItem _
 ) AS LONG
buffer
[out] Pointer to a PropertyItem structure that receives the property item.
Auch hier BYREF = var in Delphi!

verstehe wer will.

gruss

Geändert von EWeiss (27. Sep 2018 um 10:41 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#49

AW: Array of Integer und crash

  Alt 26. Sep 2018, 17:48
Ok ist erledigt Danke.

Es scheint wohl kein Fehler in der Winapi.GDIPAPI vorzuliegen.

Habe mal meine beiden Versionen 32 und 64 Bit gegengeprüft.

Bei 32 Bit ohne "var" stürzt die Anwendung ab. (D2010)
Bei 64 Bit mit "var" genauso. (DX)
----------------------------------------------
Bei 32 Bit mit var funktioniert alles. (D2010)
Bei 64 Bit ohne var auch. (DX)

Unverständlich warum es hier unterschiede gibt.

gruss

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

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

AW: Array of Integer und crash

  Alt 27. Sep 2018, 10:29
Ok ist erledigt Danke.

Es scheint wohl kein Fehler in der Winapi.GDIPAPI vorzuliegen.

Habe mal meine beiden Versionen 32 und 64 Bit gegengeprüft.

Bei 32 Bit ohne "var" stürzt die Anwendung ab. (D2010)
Bei 64 Bit mit "var" genauso. (DX)
----------------------------------------------
Bei 32 Bit mit var funktioniert alles. (D2010)
Bei 64 Bit ohne var auch. (DX)

Unverständlich warum es hier unterschiede gibt.
Wahrscheinlich vertust du dich beim Holen der einzeln Items sowie der vorigen Speicherreservierung, dass macht schnell den Stack kaputt und man hat merkwürdige Fehler.
Anbei ein Testprojekt als ZIP-Archiv und Quelltext, mit dem du nachvollziehen kannst, wie es in 32- und 64-Bit funktioniert.

Delphi-Quellcode:
unit Unit4;

interface

uses
  Winapi.Windows, System.SysUtils, System.Classes,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtDlgs;

type
  TForm4 = class(TForm)
    Memo1: TMemo;
    OpenPictureDialog1: TOpenPictureDialog;
    procedure Memo1Click(Sender: TObject);
  private
    procedure ShowExifInfos(const AFileName: string);
    procedure LogToMemo(AText: string);
  end;

var
  Form4: TForm4;

implementation

uses
  Winapi.ActiveX,
  Winapi.GDIPAPI,
  Winapi.GDIPOBJ,
  Winapi.GDIPUTIL;

{$R *.dfm}

procedure GetExifInfo(const AFileName: string; const CommonExifProperties: TArray<PROPID>; const ALogCallback: TProc<string>);
var
  Image: TGPBitmap;
  PropSize: UINT;
  PropItemPtr: PPropertyItem;
  MyPropID: PROPID;
  MyStatus: Status;
  LogMsg: string;
begin
  Image := TGPBitmap.Create(AFileName);
  try
    if (Image.GetWidth <> 0) and (Image.GetHeight <> 0) then
    begin
      for MyPropID in CommonExifProperties do
      begin
        PropSize := Image.GetPropertyItemSize(MyPropID);
        if PropSize > 0 then
        begin
          GetMem(PropItemPtr, PropSize);
          try
            MyStatus := Image.GetPropertyItem(MyPropID, PropSize, PropItemPtr);
            if MyStatus = Status.Ok then
            begin
              LogMsg := 'Exif-Property: ' + GetMetaDataIDString(PropItemPtr.id) +
                ' with PropSize: ' + PropItemPtr.length.ToString +
                ' and data type: ' + ValueTypeFromULONG(PropItemPtr.type_);

              if Assigned(ALogCallback) then
              begin
                ALogCallback(LogMsg)
              end;
            end;
          finally
            FreeMem(PropItemPtr, PropSize);
          end;
        end;
      end;
    end;
  finally
    Image.Free;
  end;
end;

procedure TForm4.LogToMemo(AText: string);
begin
  Memo1.Lines.Add(AText);
end;

procedure TForm4.Memo1Click(Sender: TObject);
var
  MyFileName: string;
begin
  OpenPictureDialog1.Filter := '*.jpg; *.jpeg';
  if OpenPictureDialog1.Execute(Self.Handle) then
  begin
    MyFileName := OpenPictureDialog1.FileName;
    LogToMemo('Öffne Datei ' + MyFileName + sLineBreak);
    ShowExifInfos(MyFileName);
    LogToMemo(sLineBreak + 'Fertig!');
  end;
end;

procedure TForm4.ShowExifInfos(const AFileName: string);
var
  CommonExifProperties: TArray<PROPID>;
begin
  CommonExifProperties := [
    PropertyTagExifAperture
      , PropertyTagExifBrightness
      , PropertyTagExifCfaPattern
      , PropertyTagExifColorSpace
      , PropertyTagExifCompBPP
      , PropertyTagExifCompConfig
      , PropertyTagExifDTDigitized
      , PropertyTagExifDTDigSS
      , PropertyTagExifDTOrig
      , PropertyTagExifDTOrigSS
      , PropertyTagExifDTSubsec
      , PropertyTagExifExposureBias
      , PropertyTagExifExposureIndex
      , PropertyTagExifExposureProg
      , PropertyTagExifExposureTime
      , PropertyTagExifFileSource
      , PropertyTagExifFlash
      , PropertyTagExifFlashEnergy
      , PropertyTagExifFNumber
      , PropertyTagExifFocalLength
      , PropertyTagExifFocalResUnit
      , PropertyTagExifFocalXRes
      , PropertyTagExifFocalYRes
      , PropertyTagExifFPXVer
      , PropertyTagExifInterop
      , PropertyTagExifISOSpeed
      , PropertyTagExifLightSource
      , PropertyTagExifMakerNote
      , PropertyTagExifMaxAperture
      , PropertyTagExifMeteringMode
      , PropertyTagExifOECF
      , PropertyTagExifPixXDim
      , PropertyTagExifPixYDim
      , PropertyTagExifRelatedWav
      , PropertyTagExifSceneType
      , PropertyTagExifSensingMethod
      , PropertyTagExifShutterSpeed
      , PropertyTagExifSpatialFR
      , PropertyTagExifSpectralSense
      , PropertyTagExifSubjectDist
      , PropertyTagExifSubjectLoc
      , PropertyTagExifUserComment
      , PropertyTagExifVer
    ];

  GetExifInfo(AFileName, CommonExifProperties, LogToMemo);
end;

end.
Angehängte Dateien
Dateityp: zip Project5_2018-09-27_10-25-46.zip (5,5 KB, 3x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 5 von 6   « Erste     345 6      


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 13:48 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