Delphi Zeiger-Arithmetik
Wie soll diese Codezeile werden writed, um es zu kompilieren
MoveMemory(poleFileDescriptorW
, (oleDataPointer + SizeOf(oleFileDescriptorW) *Index + 4)^
, SizeOf(oleFileDescriptorW));
Besonders dieser Teil
(oleDataPointer + SizeOf(oleFileDescriptorW)*Index + 4)^
Ich bin nur verschieben möchten, den Mauszeiger durch SizeOf(oleFileDescriptorW)*Index + 4
bytes
Variablen sind wie folgt definiert:
pOLEFileDescriptorW : ^FILEDESCRIPTORW;
oleDataPointer : Pointer;
- Was sind die Typen der Variablen, die Sie verwenden?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Cast auf einen integer-Typ, die Mathematik zu tun, und warf zurück.
Ich in der Regel verwendet
Cardinal
aber ich denke das funktioniert nicht mit einem 64-bit-compiler.Pointer(NativeInt(oleDataPointer) + SizeOf(oleFileDescriptorW)*Index + 4)
NativeUInt
geben.NativeUInt
?Wenn Sie mit DELPHI >= 2009, set $POINTERMATH ON und Sie können Zeiger-Arithmetik direkt
MoveMemory
und die identischenCopyMemory
Funktionen übernehmen Zeiger, nicht Variablen, wie die Delphi-RTL-FunktionMove
erfordert (und dies ist der einzige Unterschied zwischenMoveMemory
undMove
).So sollten Sie nicht dereferenzieren Sie die Zeiger. Nur tun
wo jedes argument ist ein Zeiger/Kardinal. Abhängig von Ihrer tatsächlichen Datentypen, müssen Sie möglicherweise tun einige triviale Gießen. Zum Beispiel, müssen Sie möglicherweise zu tun
PSomeType(cardinal(myPointer) + cardinal(myPointer2))
.Jedenfalls, wenn Sie irgendwann brauchen zu dereferenzieren einen Zeiger, müssen Sie Ihren Typ festlegen.
gar nicht arbeiten (warum?). Tun
Typumwandlung zu Integer.
Und Andreas war richtig, dass Sie verwenden sollten, Zeiger direkt.
Sehen, ob das funktioniert.
Gott segne
cardinal
, nichtinteger
(warum?)! AuchMoveMemory
/CopyMemory
erfordert Zeiger, nicht Variablen, so sollten Sie nicht dereferenzieren (wie in derMove
Fall).