Delphi 7缓冲区指针覆盖具有不同的数据

时间:2016-08-09 16:27:20

标签: delphi pointers overlay

我在Delphi 7中将一个大缓冲区和指针定义为Byte数组。 这是Win32 ReadEventLog调用的缓冲区。

我将第二个指针定义为缓冲区数据的记录结构。 这是一个叠加层,用于将结构添加到字节数组中。

问题:两个指针的数据不同。 Buffer ^数据与RecordPtr ^数据不同。 两个指针的地址都是一样的。

问题:声明叠加指针的正确方法是什么?

Type
  TEventRecord = record
    Length       : dword;
    Reserved     : dword;
    RecordNumber : dword;
    end;

  TByteArray = array of byte;

Var
  Buffer : TByteArray;
  RecordPtr : ^TEventRecord = @Buffer;
  MyData : TEventRecord;

begin
  Setlength (Buffer, $FFF0);
  // ReadEventLog....
  // Watch of Buffer^ and RecordPtr^ shows different data
end.

4 个答案:

答案 0 :(得分:3)

动态数组Buffer: array of byte是一个指针,因此@Buffer是指向指针的指针。

要对TEventRecord的内容进行每字节访问,可以将指针指定给字节数组数据的开头:

type
  PEventRecord = ^TEventRecord;

var
  PEventRecord_Var: PEventRecord;

begin
  PEventRecord_Var := @Buffer[0]; 

答案 1 :(得分:0)

为什么不这样做?

{{1}}

答案 2 :(得分:0)

你可以这样做:

type
  TEventRecord = record
    Length: DWORD;
    Reserved: DWORD;
    RecordNumber: DWORD;
  end;

  TByteArray = array of Byte;

Var
  Buffer: TByteArray;
  RecordPtr: ^TEventRecord = Pointer(Buffer); // Buffer is a pointer
  MyData: TEventRecord;

begin
  SetLength(Buffer, $FFF0); { Assuming that is big enough }
  { ReadEventLog(..., Pointer(Buffer), Length(Buffer), .... }
  { Watch of Buffer and RecordPtr^ shows same data. }
end.

Buffer是一个指针,它指向(大)字节数中的第一个。如果要使用此缓冲区将ReadEventLog加载到字节数组中,只需将Buffer转换为指针并将其分配给RecordPtr。

<击>

<击>

可是...

如果我理解你,另一种选择是:

Buffer: array of TEventRecord;
...
SetLength(Buffer, 6000); { 6000 event records! }
if ReadEventLog(..., Pointer(Buffer), Length(Buffer) * SizeOf(Buffer[0]), ...) then ...

现在,您可以轻松地从缓冲区访问每个事件记录。为什么使用字节数组,如果您可以直接轻松读取事件记录数组?

(上述内容适用于普通记录,但@BruceGavin告诉我,事件记录的尾部大小可变,因此无法正常工作)

答案 3 :(得分:-1)

你可以像这样实现你想要的东西:

Var
  Buffer : TByteArray;
  RecordPtr : ^TEventRecord absolute Buffer;

这使得两个变量在内存中占用相同的4个字节(或64位中的8个字节)。