Delphi指针算法

时间:2010-11-29 12:52:38

标签: delphi

如何编写这行代码以允许它编译

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

特别是这部分

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

我只想将指针移动SizeOf(oleFileDescriptorW)*Index + 4字节

变量定义为:

pOLEFileDescriptorW : ^FILEDESCRIPTORW;
oleDataPointer : Pointer;

4 个答案:

答案 0 :(得分:8)

转换为整数类型,进行数学运算并退回。

我通常使用Cardinal,但我认为这不适用于64位编译器。

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

答案 1 :(得分:6)

如果您正在使用DELPHI> = 2009,请将$ POINTERMATH设置为ON,您可以直接使用指针算法

答案 2 :(得分:2)

MoveMemory和相同的CopyMemory函数接受指针,而不是变量,因为Delphi RTL函数Move需要(这是{之间的唯一区别} {1}}和MoveMemory)。

所以你不应该取消引用指针。只是做

Move

其中每个参数都是指针/基数。根据您的实际数据类型,您可能需要进行一些简单的转换。例如,您可能需要执行MoveMemory(poleFileDescriptorW, (oleDataPointer + SizeOf(oleFileDescriptorW)*Index + 4), SizeOf(oleFileDescriptorW));

无论如何,如果你有时需要取消引用指针,你需要指定它的类型。

PSomeType(cardinal(myPointer) + cardinal(myPointer2))

无法工作(为什么?)。做

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

答案 3 :(得分:1)

Typecast to Integer。

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

Andreas是正确的,你应该直接使用指针。 看看是否有效。

上帝保佑