从 64 位项目中读取 32 位记录

read from 32bit record in 64bit project

我有一个旧项目需要重构。 这是 32 位的 Delphi5 项目。

新项目必须使用64位架构。

实际上我的意思是从文件中读取旧数据格式。

该文件包含具有很多字段的记录。

目前我对动态整数数组有疑问。

TCObject = record
  Name:string[205];
  roomindex:array of integer;

SizeOf(roomindex) = 4 在旧项目中 和 SizeOf(roomindex) = 8 在我的 64 位项目中。

所以我在从文件中读取数据时遇到了问题

stream.Read(buf, SizeOf(TCObject))

你能告诉我如何说 Delphi 来使用 size=4 吗? :)

非常感谢。

更新: 正如大卫所说,最好提供读取数据的真实代码。

procedure ParseCDatabase(pBuff: Pointer; pSize: Integer);
var
  curr:^TCObject;
  i, n: Integer;
  curri:^Integer;
begin
  curri:= pBuff;
  n:=curri^;
  Inc(curri);
  curr:=pointer(curri);
  for i:=0 to n-1 do 
  begin
    if Curr^.Name<>'' then 
    begin
      COAddObject();
      curro:=pointer(curr);
      curro.RoomIndex:=integer(nil);
      Fcodb[af][ai]:=curr^;
      SetLength(Fcodb[af][ai].RoomIndex,0);
      Inc(ai);
    end;
    inc(curr);
  end;
end;

我按原样提供代码...所以我们在这里看到 roomindex 已读取但重置为 0。 所以实际上我们根本不需要它。

问题是通过指针读取整个数据,因为指向动态数组的点的大小现在是 8 而不是 4。

roomindex是一个指针,在32位工程中为4字节,在64位工程中为8字节。你不能现实地改变它。我很惊讶你保存了一个指向文件的指针,然后把它加载回来。除非指针被丢弃,否则它如何工作?假设您保存指针但丢弃它,您可以这样做:

TCObjectOldFormat = record
  Name:string[205];
  roomindex: Int32;
end;

TCObject = record
  Name:string[205];
  roomindex:array of integer; 
end;

var
  AObject : TCObject;
  AObjectOldFormat :TCObjectOldFormat;
...
stream.ReadBuffer(AObjectOldFormat, SizeOf(TCObjectOldFormat));
AObject.Name := AOldObject.Name;

很明显,您可以使用 buf 来适应您的需求。这只是更明确地展示了这个想法。