从 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 来适应您的需求。这只是更明确地展示了这个想法。
我有一个旧项目需要重构。 这是 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 来适应您的需求。这只是更明确地展示了这个想法。