Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   GDI+ Delphi Berlin oder höher (https://www.delphipraxis.net/205214-gdi-delphi-berlin-oder-hoeher.html)

himitsu 13. Aug 2020 21:11

AW: GDI+ Delphi Berlin oder höher
 
Jupp, wenn man den String richtig gefüllt hat, dann ist im Inhalt keine #0 mehr drin. :stupid:


Den Compilerschalter kann es leider nicht geben.

Man könnte ja nur lokal, in seiner Unit, den Typ ändern.
Aber die Funktionen betrifft das nicht.

Vorallem in den APIs sind diese ja nicht Überladen, sondern heißen alle anders.
String, PChar und Char in deiner Unit OK,
aber CreateFile wird in einer anderen Unit auf CreateFileW umgeleitet. Und Diese ist vorkompiliert und somit quasi unveränderlich.

Benmik 13. Aug 2020 22:47

AW: GDI+ Delphi Berlin oder höher
 
Du kannst einen String als AnsiString deklarieren:
Delphi-Quellcode:
var AnsiTxt: AnsiString;

Das sollte im Zusammenhang mit GDI+ aber gar nicht nötig sein; bei ASCII - also Property-Typ 2 - solltest du mit
Delphi-Quellcode:
SetString(ZielTxt, PAnsiChar(PPropItem.value), PPropItem.length - 1));
ohne Probleme hinkommen. Mich würde ein Beispiel interessieren, sollte das doch mal nicht der Fall sein.

KodeZwerg 14. Aug 2020 07:24

AW: GDI+ Delphi Berlin oder höher
 
Ich weiß gerade nicht ob per Inception das machbar ist.
Mit Vcl's weiß ich es zu 100pro das es klappt.
Dient mir als Ersatz für "Helper" wenn ich mich immer nur an's original halten möchte.
Eine Unit erstellen wo lediglich "String" als "AnsiString" definiert wird.
Diese Unit dann als letzte in Deinem Projekt einbinden.
Schon ist wieder alles wie vor 20 Jahren, aber ob man das wirklich will ist jedem selbst überlassen.

himitsu 14. Aug 2020 13:37

AW: GDI+ Delphi Berlin oder höher
 
Wie gesagt, es ist egal, denn du kannst nur den Typ in deiner Unit mit einem anderen Typen überdecken,
aber externe Definitionen beeinflusst es nicht.

Abgesehn davon ist String schwachsinniger Weise seit Jahrzehnten immernoch ein resserviertes Wort und da geht Vieles nicht.

Willie1 15. Aug 2020 16:36

AW: GDI+ Delphi Berlin oder höher
 
Ich habe in meiner Bibliothek alle string durch AnsiString, PChar durch PAnsiChar und alle Char durch AnsiChar ersetzt, TstringList bleibt unverändert, und der Compiler meckert bei meinem Testprogramm nicht mehr. Bei Filename habe ich string durch TFilename ersetzt. Jetzt läuft es auch mit dem GDP-Dateien von 2003. Verrenkungen bei string sind also nicht nötig. "Alte Sünden werden nicht vergessen" bei meiner Lösung crasht es bei Bildern vom IPhone, das war und ist immer noch so. Jetzt packt mich der Ehrgeiz auch das will ich lösen.
Delphi-Quellcode:
          else                    //alle anderen
          with PropItem^ do begin
            Move(Value^, RationalBuff, Length);
            R1:=RationalBuff[0];
            R2:=RationalBuff[1];
            s:=Format('%d/%d',[R1,R2]);
            try
            s1:=ShowID(ShowTagStr, GetMetaDataIDString(id), PropID);
            except
              Result:=s;
              Exit;
            end;
            Result:=Format('%s %s',[s1,s])
          end;
Es geht um PropertyItem^.id, der Debugger zeigt eine Cardinal-Zahl an, wenn es klappt und meldet "nicht verfügbarer Wert", wenn es crasht. Die Routine liefert ein richtiges Result und erst beim Verlassen der Funktion gibt es den Zugriffsfehler.
Willie.

himitsu 15. Aug 2020 17:44

AW: GDI+ Delphi Berlin oder höher
 
Was ist RationalBuff?

Bei dem MOVE, könnte man z.B. an ungültige Zeiger und einen Bufferoverflow denken.

Willie1 15. Aug 2020 18:54

AW: GDI+ Delphi Berlin oder höher
 
RationlBuff ist ein Array[0..1] of Integer für Zähler und Nenner. Wie geht das ohne Move, ist mir klar, das das unsicher ist.

Benmik 16. Aug 2020 12:18

AW: GDI+ Delphi Berlin oder höher
 
Es geht hier um den Datentyp 5. Eigentlich soll er 8 Bytes lang sein mit 4 Bytes Zähler und 4 Bytes Nenner. Laut Spezifikation ist er "unsigned", müsste also 2 x Cardinal sein, denn es gibt ihn auch noch mit Vorzeichen als Typ 10.

Es ist aber keineswegs so, dass der Typ 5 immer nur 2 x 4 = 8 Bytes hat, zum Beispiel nicht bei den GPS-Werten. Bei GPSLongitude und GPSLatitude hat er 3 x 8 = 24 Bytes (das ist auch so bei EXIFTool vermerkt). Da könnte es bei deinem iPhone haken, weil es vermutlich GPS-Daten in die JPG schreibt. Daher ist deine Lösung nicht optimal an den Typ 5 angepasst.

Ich mache das ungefähr so (ist jetzt so dahingeworfen):
Delphi-Quellcode:
var Buff:TBytes;
    Zähler,Nenner,DritterWert:Cardinal;
begin
  SetLength(Buff,Length);
  Move(Value^, Buff[0], Length);
  Zähler := PCardinal(@TB[0])^;
  Nenner := PCardinal(@TB[4])^;
  If Length >= 12
    then DritterWert := PCardinal(@TB[8])^;
end;
Der Zusammenbau von GPSLatitude etc. ist auch nicht ganz trivial. Das verdeutlich das Prinzip, vielleicht hilft dir das erstmal weiter.

Willie1 16. Aug 2020 15:50

AW: GDI+ Delphi Berlin oder höher
 
Zitat:

Zitat von Benmik (Beitrag 1471896)
Es geht hier um den Datentyp 5.

Der Zusammenbau von GPSLatitude etc. ist auch nicht ganz trivial. Das verdeutlich das Prinzip, vielleicht hilft dir das erstmal weiter.

Ja, es geht um PropertyTagTypeRational: 2 Zahlen = 4 Bytes für Zähler und Nenner. Ich hatte es mit Move gemacht, vor 15 Jahren konnte ich es nicht besser. Bennik, genau die Geo-Koordinaten haben mich auf diese Idee gebracht, es geht.
Delphi-Quellcode:
  Type
    TRationalBuff = array[0..1] of Integer;
    TPRationalBuff = ^TRationalBuff;

          else                    //alle anderen
          with PropItem^ do begin
//            Move(Value^, RationalBuff, Length);   //löst Fehler bei Apple aus
            RationalBuff := TPRationalBuff(Value)^;
            R1:=RationalBuff[0];
            R2:=RationalBuff[1];
            if R2 > 0 then
              s:=Format('%0.4f',[R1 / R2])
            else
              s:='error';
            s1:=ShowID(ShowTagStr, GetMetaDataIDString(id), PropID);
            Result:=Format('%s %s',[s1,s])
          end;
Die GDP-Dateien habe ich natürlich auch neu kompiliert, da gibt es viele string - Typen, jetzt alle als 16-Bit-String, Kann es da zu Problemen kommen? Ich weiß aus schmerzhafter Erfahrung Test- oder Demoprogramm ist das eine, der Einsatz in einem großen Programm ist das andere. Meine Motivation hatte ich oben erklärt. Willie.

Benmik 16. Aug 2020 17:45

AW: GDI+ Delphi Berlin oder höher
 
Der RationalBuff kann nur 8 Byte aufnehmen, bei GPS sind es aber 24. Mit ihm kommst du also nicht an bestimmte GPS-Daten ran (GPSLongitude, GPSLatitude).

Move an sich ist völlig OK; man kann es auch über eine Pointer-Variable machen, aber dann hat man nicht die Flexibilität von TBytes. Ich meine, es ist immer noch am besten, Length zu messen, TBytes entsprechend zu dimensionieren und danach zu handeln.

Bei den Stringtypen von Typ 7 ist es nicht ganz so einfach, die können laut Spezifikation auch Unicode sein, worauf du mit AnsiChar nicht weiter kommst. Das betrifft vor allem UserComment. Man kann die Strings ruhig bei Delphi-String belassen, muss sich dann aber um die Konvertierungen kümmern.

Ich muss jetzt zum Zug; später komme ich eventuell dazu, etwas zu posten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:29 Uhr.
Seite 2 von 3     12 3      

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