在Delphi 10.2 Tokyo中将访问冲突移植到32位到64位

时间:2018-09-01 00:37:57

标签: delphi 64-bit

尝试将一些代码从32位delphi移植到64位。编译后,我得到了访问冲突在64位comple的这一行(在32位上可以正常工作)

 PByte = ^Byte;

function TyDecoder.findCRLF(pStart,pEnd: PByte): PByte;
begin
 while (Not (((pStart^=13) and (pByte(Integer(pStart)+1)^=10)) or (pStart^=10))) and (Integer(pStart)<Integer(pEnd))   do Inc(pStart);
 Result:=pStart;
end;

以前有很多问题将其从D7移植到东京10.2,但这些问题已通过将所有字符串声明更改为Ansistring而得到纠正。

我猜想这可能与指针类型现在为8而不是4有关。

被困住了。

1 个答案:

答案 0 :(得分:6)

您已经被告知可以使用NativeInt(或NativeUInt)来获取指针大小的整数。但是对于Delphi 10.2,您的表达仍然不必要地复杂。 Delphi的PByte(不是您的,所以不要自己定义)可以进行指针数学计算,因此请尝试:

function TyDecoder.findCRLF(pStart, pEnd: PByte): PByte;
begin
  while (not (((pStart[0] = 13) and (pStart[1] = 10)) or (pStart[0] = 10))) and
        (pStart < pEnd) do
    Inc(pStart);    
  Result := pStart;
end;

如果愿意,可以使用pStart[0]代替pStart^,并且可以使用pStart[1]代替(pStart + 1)^

也请阅读online documentation about pointer math in Delphi