Wieso geht string(ResID)
?
String
ist ein
PChar
+ Referenzzähler + Länge + Elementgröße + Codepage + Terminus (
#0
).
Da ein
PChar
ein Zeiger ist und dieser unter 64-Bit eine Größe von 64 Bit hat, kannst du in ihm also ohne Probleme eine 32-Bit-Zahl (wie in dem Beispiel
ResID
) speichern. Du kannst ja sonst auch
Integer
zu
Int64
casten, ohne dass der Compiler rummeckert.
Deshalb geht unter 64-Bit, genau wie unter 32-Bit:
PChar(MyInteger)
. Das gleiche mit
String
geht zwar nicht, allerdings kannst du das über einen Doppelcast machen:
String(PChar(MyInteger))
.
Grundsätzlich solltest du dies aber vermeiden, da es andersherum nur mit ggf. einem Datenverlust funktionert. Für so etwas hast du unter allen Plattformen das Alias
NativeInt
(bzw.
NativeUInt
für die vorzeichenlose Entsprechung), oder, speziell für diesen Fall:
IntPtr
.
Wenn du mit der Windows-
API arbeitest, hast du hier wiederrum das Alias:
INT_PTR
, was nichts anderes ist. Auch diese beiden Typen haben wiederrum eine unsignierte Form mit jeweils einem "U" vor dem Namen.
Außerdem musst du halt grundsätzlich sehr vorsichtig mit dem
String
/
Integer
casten sein, denn:
- beim Kopieren des Integer
s wird das ganze andere, wie die Länge und Referenzzählung nicht mit kopiert. Es kann also zu Datenverlust führen.
- Der Referenzzähler funktioniert nur, wenn die Variable den Typen String
hat. Es kann also sein, dass dieser einfach freigegeben wird, weil das System denkt, dass du ihn nicht mehr benötigst.
- Das Aufrufen von bspw. Length(String(MyInteger))
kann zu Zugriffsverletzungen führen.
Auch bringst du die Type-Info durcheinander, denn
TypeInfo(String(MyInteger))
ergibt immernoch
TypeInfo(Integer)
.
Ich hoffe das war jetzt nicht zu ausführlich. Aber du wolltest wissen, warum es geht und was 64-Bit da für auswirkungen drauf hat.