2010-11-29 2 views
4

Как следует эта строка кода будет writed, чтобы позволить ему составитьDelphi указатель арифметика

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

В частности, эту часть

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

Я просто хочу, чтобы переместить указатель на SizeOf(oleFileDescriptorW)*Index + 4 байты

Переменные определены как:

pOLEFileDescriptorW : ^FILEDESCRIPTORW; 
oleDataPointer : Pointer; 
+0

Какие типы переменных, которые вы используете? – 2010-11-29 12:53:34

ответ

8

Присваивается целочисленному типу, выполняется математика и отбрасывается.

Обычно я использую Cardinal, но я думаю, что это не работает с 64-битным компилятором.

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

+0

Delphi все еще 32-бит. Неважно, какая у вас ОС. В 64-битной ОС программа будет запускаться под управлением WOW. – 2010-11-29 13:03:33

+2

Есть * еще * нет 64-разрядной версии Delphi? Тем не менее, я бы хотел, чтобы мой код работал с будущими 64-битными компиляторами delphi (или 64-битным freepascal) – CodesInChaos 2010-11-29 13:06:16

2

MoveMemory и идентичные CopyMemory функции принимают указатели, а не переменные, а функция Delphi RTL Move требует (и это единственное различие между MoveMemory и Move).

Таким образом, вы не должны разыменовывать указатель. Просто сделайте

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

где каждый аргумент является указателем/кардиналом. В зависимости от ваших фактических типов данных вам может потребоваться сделать тривиальное литье. Например, вам может потребоваться сделать PSomeType(cardinal(myPointer) + cardinal(myPointer2)).

Во всяком случае, если вам когда-нибудь понадобится разыменовать указатель, вам нужно указать его тип.

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

не может работать (почему?). Do

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

Typecast to Integer.

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

И Andreas был прав, что вы должны использовать указатели непосредственно. Посмотрите, работает ли это.

Бог благословит

6

Если вы используете DELPHI> = 2009, установите $ POINTERMATH на ON и вы можете использовать арифметику указателей непосредственно

Смежные вопросы