2010-11-29 5 views
4

Comment cette ligne de code soit Ecrite pour lui permettre de compilerDelphi pointeur arithmétique

MoveMemory(poleFileDescriptorW 
     , (oleDataPointer + SizeOf(oleFileDescriptorW) *Index + 4)^ 
     , SizeOf(oleFileDescriptorW)); 

particulièrement cette partie

(oleDataPointer + SizeOf(oleFileDescriptorW)*Index + 4)^

Je suis juste envie de passer le pointeur par SizeOf(oleFileDescriptorW)*Index + 4 octets

Les variables sont définies comme suit:

pOLEFileDescriptorW : ^FILEDESCRIPTORW; 
oleDataPointer : Pointer; 
+0

Quels sont les types des variables que vous utilisez? –

Répondre

8

Transmettre à un type entier, effectuer les calculs et les renvoyer.

J'ai généralement utilisé Cardinal mais je pense que cela ne fonctionne pas avec un compilateur 64 bits.

Pointer(NativeInt(oleDataPointer) + SizeOf(oleFileDescriptorW)*Index + 4)

+0

Delphi est toujours 32 bits seulement. Peu importe le type d'OS que vous avez. Sur un système d'exploitation 64 bits, le programme s'exécutera sous WOW. –

+2

Il n'y a pas encore de version 64 bits de Delphi? Je voudrais quand même que mon code fonctionne avec les futurs compilateurs Delphi 64 bits (ou freepascal 64 bits) – CodesInChaos

+2

@CodeInChaos: Vous pouvez utiliser le type 'NativeUInt'. –

2

MoveMemory et les fonctions identiques CopyMemory acceptent pointeurs, pas de variables, comme la fonction Delphi RTL Move nécessite (ce qui est la seule différence entre MoveMemory et Move).

Vous ne devriez donc pas déréférencer le pointeur. Just

MoveMemory(poleFileDescriptorW, 
      (oleDataPointer + SizeOf(oleFileDescriptorW)*Index + 4), 
      SizeOf(oleFileDescriptorW)); 

où chaque argument est un pointeur/cardinal. En fonction de vos types de données réels, vous devrez peut-être effectuer un casting trivial. Par exemple, vous devrez peut-être faire PSomeType(cardinal(myPointer) + cardinal(myPointer2)).

De toute façon, si vous deviez parfois déréférencer un pointeur, vous devez spécifier son type.

(oleDataPointer + SizeOf(oleFileDescriptorW)*Index + 4)^ 

ne pouvait pas fonctionner (pourquoi?). Faites

PMyType(cardinal(oleDataPointer) + SizeOf(oleFileDescriptorW)*Index + 4)^ 
1

Typecast Integer.

Pointer(Integer(oleDataPointer) + SizeOf(oleFileDescriptionW) * Index + 4) 

Et Andreas avait raison que vous devez utiliser des pointeurs directement. Voir si cela fonctionne.

Dieu bénisse

+0

Vous devriez lancer 'cardinal', pas' integer' (pourquoi?)! En outre, 'MoveMemory' /' CopyMemory' nécessite des pointeurs, pas des variables, donc vous ne devriez pas déréférencer (comme dans le cas 'Move'). –

+1

Je préfère un type entier non signé, mais c'est surtout un problème de style. Mais votre code peut échouer si les contrôles de dépassement d'entier sont activés (ils sont désactivés par défaut) – CodesInChaos

+0

@andreas Pourquoi pas Integer? Delphi effectue-t-il une conversion et perd les données en cas de dépassement de capacité? – Trinidad

6

Si vous utilisez DELPHI> = 2009, définissez $ POINTERMATH sur ON et vous pouvez utiliser l'arithmétique des pointeurs directement