AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Records unter 32 und 64Bit

Ein Thema von EWeiss · begonnen am 27. Aug 2018 · letzter Beitrag vom 29. Aug 2018
Antwort Antwort
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

AW: Records unter 32 und 64Bit

  Alt 27. Aug 2018, 16:05
PWideChar ist unter 64-Bit 8 Byte groß, statt 4. Dadurch sind alle weiteren Felder nach hinten verschoben im Speicher.
Versteh danke..
Aber warum funktioniert es dann bei langen Pfaden? Da wird auch PWideChar verwendet. (Glück? )
Und es wird nicht alles verschoben wie du im shot sehen kannst nur die ersten beiden werden verändert.
Mh stimmt.
Wie kommen denn die Daten in das Record bzw. Array?
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: Records unter 32 und 64Bit

  Alt 27. Aug 2018, 16:08
PWideChar ist unter 64-Bit 8 Byte groß, statt 4. Dadurch sind alle weiteren Felder nach hinten verschoben im Speicher.
Versteh danke..
Aber warum funktioniert es dann bei langen Pfaden? Da wird auch PWideChar verwendet. (Glück? )
Und es wird nicht alles verschoben wie du im shot sehen kannst nur die ersten beiden werden verändert.
Mh stimmt.
Wie kommen denn die Daten in das Record bzw. Array?
Frage ich mich selbst..
Ich stoße wirklich auf viele dieser seltsamen verhalten in Verbindung mit 64Bit.
Ist auch glaube ich nicht nötig da ich damit keinen Record außerhalb der EXE ansprechen.

Habe es mit
Code:
{$ALIGN ON}
{$MINENUMSIZE 4}
versucht da ich dachte vielleicht liegt es hier dran.. aber nein keine Chance.

Wie sie da rein kommen bzw.. übergeben werden ist im Quelltext ersichtlich.

gruss

Geändert von EWeiss (27. Aug 2018 um 16:12 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Records unter 32 und 64Bit

  Alt 27. Aug 2018, 16:14
Wie sie da rein kommen bzw.. übergeben werden ist im Quelltext ersichtlich.
Ja das meinte ich.
Und das ist ein sehr wichtiger Punkt der besser in deinem Post enthalten wäre als *irgendwo* in deinem angehangenen Quelltext.
Es gibt wahrscheinlich nicht viele die sich nur deswegen deinen gesamten Code anschauen wollen. (Ich z.B. auch nicht)
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: Records unter 32 und 64Bit

  Alt 27. Aug 2018, 16:15
Wie sie da rein kommen bzw.. übergeben werden ist im Quelltext ersichtlich.
Ja das meinte ich.
Und das ist ein sehr wichtiger Punkt der besser in deinem Post enthalten wäre als *irgendwo* in deinem angehangenen Quelltext.
Es gibt wahrscheinlich nicht viele die sich nur deswegen deinen gesamten Code anschauen wollen. (Ich z.B. auch nicht)
OK! Du hast recht
So werden sie übergeben.

Delphi-Quellcode:
 
var
  SpriteResPath: string;
//..
  SpriteResPath := ExtractFilePath(ParamStr(0)) + 'SpriteRes\';
  
  gSpriteData[1].ImageName := PWideChar(SpriteResPath + '3.png');
  gSpriteData[2].ImageName := PWideChar(SpriteResPath + '1.png');
  gSpriteData[3].ImageName := PWideChar(SpriteResPath + '2.png');
  gSpriteData[4].ImageName := PWideChar(SpriteResPath + '1.png');
  gSpriteData[5].ImageName := PWideChar(SpriteResPath + '2.png');
  gSpriteData[6].ImageName := PWideChar(SpriteResPath + '1.png');
  gSpriteData[7].ImageName := PWideChar(SpriteResPath + '2.png');
  gSpriteData[8].ImageName := PWideChar(SpriteResPath + '1.png');
  gSpriteData[9].ImageName := PWideChar(SpriteResPath + '2.png');
  gSpriteData[10].ImageName := PWideChar(SpriteResPath + '1.png');
gruss
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

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

AW: Records unter 32 und 64Bit

  Alt 27. Aug 2018, 16:18
Da liegt das Problem. PWideChar ist ein Zeiger und dein Konstrukt SpriteResPath + 'irgendwas' erzeugt eine temporäre RValue. Der Zeiger kann theoretisch in der nächsten Anweisung schon wieder ungültig sein. Dass das unter 32-Bit funktioniert, war reiner Zufall

Also genauer gesagt: Durch deinen Cast nach PWideChar bringst du das interne Ref-Counting des Strings durcheinander. Besteht die Möglichkeit .ImageName einfach als String zu deklarieren? Das würde dein Problem lösen.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: Records unter 32 und 64Bit

  Alt 27. Aug 2018, 16:18
Da liegt das Problem. PWideChar ist ein Zeiger und dein Konstrukt SpriteResPath + 'irgendwas' erzeugt eine temporäre RValue. Der Zeiger kann theoretisch in der nächsten Anweisung schon wieder ungültig sein. Dass das unter 32-Bit funktioniert, war reiner Zufall
Es funktioniert auch unter 64Bit aber nur mit langen Pfaden.

Zitat:
einfach als String zu deklarieren?
Jo das geht.. wäre kein Problem aber wie ich schon sagte mit langen Pfaden funktioniert es auch unter 64Bit.
Das sind so die dinge die ich nicht verstehe.

gruss

Geändert von EWeiss (27. Aug 2018 um 16:22 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: Records unter 32 und 64Bit

  Alt 27. Aug 2018, 16:22
Jo das geht.. wäre kein Problem aber wie ich schon sagte mit langen Pfaden funktioniert es auch unter 64Bit.
Kann schon sein, ist aber ebenfalls "Zufall", dass das funktioniert. Mit String deklariert bist du immer auf der sicheren Seite
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

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

AW: Records unter 32 und 64Bit

  Alt 27. Aug 2018, 16:25
Hat vermutlich gar nichts mit den Strings/PWideChars zu tun, aber

Delphi-Quellcode:
var
  ...
  DC: Cardinal;

...

DC := GetDC(MainHandle);
könnte unter 64-Bit einen Überlauf erzeugen, da ein HDC dort nicht mehr in einen Cardinal passt.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 08:46 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