AGB  ·  Datenschutz  ·  Impressum  







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

Header aus PNG laden

Ein Thema von EWeiss · begonnen am 23. Mär 2017 · letzter Beitrag vom 23. Mär 2017
Antwort Antwort
Benutzerbild von Zacherl
Zacherl

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

AW: Header aus PNG laden

  Alt 23. Mär 2017, 01:42
So wie der Code oben abgebildet wirft er mir kein Exeption glaube mir das Bitte.
D2010.
In meiner Erinnerung hat selbst Delphi 7 beim Aufruf von StrToInt mit ungültiger Zahl schon eine Exception geschmissen. So oder so ist "ANIM" auf jeden Fall keine Zahl, weshalb StrToInt nicht funktionieren kann und in irgendeiner Form fehlschlagen wird.

Aber nur zur Sicherheit:
Der Code wird wirklich ausgeführt und du hast auch keinen Exception Handler um den Aufruf, der die Exception ggfls. abfangen könnte?

Zitat:
Der Header steht genau in der von dir modellierten Form (TAniHeader) direkt am Anfang der Datei?
Nein ganz hinten
Dann kannst du einfach mit TFileStream.Seek ans Ende der Datei abzüglich SizeOf(TAniHeader) springen und den Header direkt mit TFileStream.Read(anih, SizeOf(anih)) auslesen.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: Header aus PNG laden

  Alt 23. Mär 2017, 01:45
Zitat:
Aber nur zur Sicherheit:
Der Code wird wirklich ausgeführt und du hast auch keinen Exception Handler um den Aufruf, der die Exception ggfls. abfangen könnte?
Ich habe mal MadExcept angeworfen und nein so wie du am bild sehen kann gibt der Compiler True zurück ohne wenn und aber
Aber ich glaube dir das es falsch ist.

Zitat:
Dann kannst du einfach mit TFileStream.Seek ans Ende der Datei abzüglich SizeOf(TAniHeader) springen und den Header direkt mit TFileStream.Read(anih, SizeOf(anih)) auslesen.
Sorry kannst du mir das am Code verbildlichen?

gruss

Geändert von EWeiss (11. Jul 2019 um 15:47 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

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

AW: Header aus PNG laden

  Alt 23. Mär 2017, 01:48
Zitat:
Aber nur zur Sicherheit:
Der Code wird wirklich ausgeführt und du hast auch keinen Exception Handler um den Aufruf, der die Exception ggfls. abfangen könnte?
Ich habe mal MadExcept angeworfen und nein so wie du am bild sehen kann gibt der Compiler True zurück ohne wenn und aber
Das ist interessant Was gibt StrToInt('ANIM') denn für einen Wert zurück? Das ist jetzt mal spannend herauszufinden.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: Header aus PNG laden

  Alt 23. Mär 2017, 01:50
Zitat:
Aber nur zur Sicherheit:
Der Code wird wirklich ausgeführt und du hast auch keinen Exception Handler um den Aufruf, der die Exception ggfls. abfangen könnte?
Ich habe mal MadExcept angeworfen und nein so wie du am bild sehen kann gibt der Compiler True zurück ohne wenn und aber
Das ist interessant Was gibt StrToInt('ANIM') denn für einen Wert zurück? Das ist jetzt mal spannend herauszufinden.
Er durchläuft das Array bis 8 und schaltet dann auf true.
Ausgeben tut er sonst nichts.

Aber wie gesagt es kann nicht richtig sein auch wenn das Ergebnis true ist.
So komme ich nicht an den Header.

Das ist was ich sehe wenn IntI 8 ist.


gruss

Geändert von EWeiss (11. Jul 2019 um 15:47 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

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

AW: Header aus PNG laden

  Alt 23. Mär 2017, 01:53
Zitat:
Aber nur zur Sicherheit:
Der Code wird wirklich ausgeführt und du hast auch keinen Exception Handler um den Aufruf, der die Exception ggfls. abfangen könnte?
Ich habe mal MadExcept angeworfen und nein so wie du am bild sehen kann gibt der Compiler True zurück ohne wenn und aber
Das ist interessant Was gibt StrToInt('ANIM') denn für einen Wert zurück? Das ist jetzt mal spannend herauszufinden.
Er durchläuft das Array bis 8 und schaltet dann auf true.
Ausgeben tut er sonst nichts.
Was passiert denn, wenn du mal ganz am Anfang der Funktion testweise ein ShowMessage(IntToStr(StrToInt('ANIM'))) machst? Würde mich mal interessieren.

Aber wie gesagt es kann nicht richtig sein auch wenn das Ergebnis true ist.
So komme ich nicht an den Header.
Wenn der Header tatsächlich immer am Dateiende ist, kannst du ihn ganz einfach so auslesen und dir sowohl das Byte-Array, als auch die komische Schleife sparen:
Delphi-Quellcode:
FileStream := TFilestream.Create(wsFile ,fmopenread or fmShareDenyNone);
  try
    FileStream.Seek(-SizeOf(TAniHeader), soEnd);
    FileStream.Read(anih, SizeOf(anih));
  finally
    FileStream.Free;
  end;
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: Header aus PNG laden

  Alt 23. Mär 2017, 01:56
Zitat:
Was passiert denn, wenn du mal ganz am Anfang der Funktion testweise ein ShowMessage(IntToStr(StrToInt('ANIM'))) machst? Würde mich mal interessieren.
Klar mache ich gerne.

Da steht 0.
Klasse jetzt habe ich den Header.
Jetzt muss ich nur noch wissen ob ANIM existiert. Sign ist nur ein Zahlenwert.

Noch ein Bild

gruss

Geändert von EWeiss (11. Jul 2019 um 15:47 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

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

AW: Header aus PNG laden

  Alt 23. Mär 2017, 02:02
Sehr seltsam. Entweder ein Bug in D2010 oder irgendeine seltene Einstellung, die du vorgenommen hast. Naja egal, für dein Problem ja nicht weiter relevant jetzt.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

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

AW: Header aus PNG laden

  Alt 23. Mär 2017, 02:09
Jetzt muss ich nur noch wissen ob ANIM existiert. Sign ist nur ein Zahlenwert.
Ob du 'ANIM' jetzt als 4-stelligen ANSI-String, oder als 4-Byte DWORD vorliegen hast, macht im Grunde keinen Unterschied. Am Einfachsten ist es, wenn du anih.Sign einfach mit dem korrekten Zahlenwert (0x4D494E41) vergleichst.

Das ShowMessage(IntToStr(StrToInt('ANIM'))); wirft definitiv eine Exception. Ich habe die Vermutung, dass er die Schleife gar nicht durchläuft und so an die Stelle gar nicht erst kommt.
Deshalb hatte ich ja gefragt, ob er mal diesen Testcode mit der MessageBox direkt an den Anfang der Funktion packen kann. Ich bin auch der Meinung, dass eine Exception kommen müsste, aber anscheinend gibt StrToInt bei seiner Konfiguration einfach nur still und heimlich 0 zurück Kann ich mir auch nicht erklären.

@Emil:
Kannst du den MessageBox Code mal noch in einem komplett leeren Projekt testen? Vielleicht hast du an irgendeiner Stelle davor eine Memory Corruption verursacht, die jetzt den Programmfluss in komischer Weise stört.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl (23. Mär 2017 um 02:11 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

AW: Header aus PNG laden

  Alt 23. Mär 2017, 02:02
Das
ShowMessage(IntToStr(StrToInt('ANIM'))); wirft definitiv eine Exception. Ich habe die Vermutung, dass er die Schleife gar nicht durchläuft und so an die Stelle gar nicht erst kommt.
Angehängte Grafiken
Dateityp: jpg Unbenannt.JPG (38,2 KB, 4x aufgerufen)
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#10

AW: Header aus PNG laden

  Alt 23. Mär 2017, 02:07
Das
ShowMessage(IntToStr(StrToInt('ANIM'))); wirft definitiv eine Exception. Ich habe die Vermutung, dass er die Schleife gar nicht durchläuft und so an die Stelle gar nicht erst kommt.
Delphi-Quellcode:
function TAnimatePng.GetPngAnimation(wsFile: string; var anih: TAniHeader): Bool;
var
  ByteArray: array of byte;
  FileStream: TFileStream;
  IntI: Integer;
begin
  Result := False;
  ShowMessage(IntToStr(StrToInt('ANIM')));

  try
    FileStream := TFilestream.Create(wsFile ,fmopenread or fmShareDenyNone);
    FileStream.Seek(-SizeOf(TAniHeader), soEnd);
    FileStream.Read(anih, SizeOf(anih));
  finally
    FileStream.Free;
  end;

end;
Wirft kein Exception
Das ist Fakt.

Sign ist nur ein Zahlenwert.
Wie bekomme ich den jetzt als String?

gruss

Geändert von EWeiss (11. Jul 2019 um 15:47 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz