我在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.
答案 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个字节)。