IdGlobal中的Delphi 2007和Indy10编译错误

IdGlobal中的Delphi 2007和Indy10编译错误,delphi,delphi-2007,indy10,Delphi,Delphi 2007,Indy10,我刚刚将我的Indy10安装更新为最新版本(5260),现在我在尝试编译从电子邮件服务器接收电子邮件的Windows服务时出错 [DCC错误]IdGlobal.pas(8657):F2084内部错误:C4963 恢复到5239版不会导致问题 问题似乎出现在第8633行的IdGlobal.ReadLnFromStream中: LBufSize := ReadTIdBytesFromStream(AStream, LBuf, LBufSize); 我想知道这是否是一个64位问题,是否有其他人遇到过

我刚刚将我的Indy10安装更新为最新版本(5260),现在我在尝试编译从电子邮件服务器接收电子邮件的Windows服务时出错

[DCC错误]IdGlobal.pas(8657):F2084内部错误:C4963

恢复到5239版不会导致问题

问题似乎出现在第8633行的
IdGlobal.ReadLnFromStream
中:

LBufSize := ReadTIdBytesFromStream(AStream, LBuf, LBufSize);

我想知道这是否是一个64位问题,是否有其他人遇到过这个问题?我正在Windows 7 Professional x64上使用Delphi 2007。

我不知道这是什么时候改变的,为什么会改变,但我有相同的问题(Delphi 2007)。ReadTidByteTesFromStream似乎希望将int64(TIdStreamSize)作为Count参数传递,但传递的变量(LBufSize)是整数

这似乎会给编译器带来相当大的问题,并引发内部错误。我浏览了Indy代码,直到找到了该函数调用的其他示例,这些示例没有生成错误

我在TIdHashIntf.GetHashBytes方法中找到了这段代码,并从中借用了它

 repeat
   LSize := ReadTIdBytesFromStream(AStream,LBuf,IndyMin(ASize, 2048));
然后,我将ReadLnFromStream中的代码更改为:

repeat
  LBufSize := IndyMin(LStrmSize - LStrmPos, LBUFMAXSZE);
  LBufSize := ReadTIdBytesFromStream(AStream, LBuf, LBufSize);
对此

repeat
  LBufSize := ReadTIdBytesFromStream(AStream, LBuf, IndyMin(LStrmSize - LStrmPos, LBUFMAXSIZE));
现在印地又开始建造和遵守了

据我所知,这一改变不会影响任何事情(除了修复损坏的构建),但我可以理解它有点WTF。不必深入探讨为什么有些变量是int,有些是int64,还有一些是TIdStreamSize,这是我能做的最好的了。也许雷米能启发我们大家


顺便说一句,我注意到如果在调试模式下编译,则不会出现致命的编译器错误。

FYI,第8633行是
LBufSize:=IndyMin(LStrmSize-LStrmPos,LBUFMAXSIZE)您引用的行是第8634行。那么,哪一行才是真正的问题呢?我能想到的唯一一件事是,这两行都涉及IntegerInt64转换,但我无法想象编译器会因为这一点而窒息,特别是如果它以前工作过的话。但是不管怎样,尽管在过去的两个月里,
IdGlobal.pas
发生了很多变化(主要是为iOS 64位做准备),所有更改都不应该像这样影响
ReadLnFromStream()
。但这是一个内部错误,这意味着即使在编译器到达
ReadLnFromStream()
之前,任何东西都有可能使编译器处于错误状态。我没有安装D2007,所以我自己无法解决问题。如果您可以缩小修复范围,您可以将其发送给我进行签入。出于好奇,如果您更改此行,是否仍会发生错误:
LBufSize:=IndyMin(LStrmSize-LStrmPos,LBUFMAXSIZE)到此:
LBufSize:=整数(IndyMin(LStrmSize-LStrmPos,LBUFMAXSIZE))?或者将
ReadTIdBytesFromStream()
更改为使用
Integer
而不是
TIdStreamSize
?@RemyLebeau-LBufsize声明为Integer,ReadTIdBytesFromStream需要一个TIdStreamSize,但调用一个需要Integer的类方法。我想我在看8634,将LBufSize改为TIdStreamSize修复了它,为所有错误道歉,我现在已经没有内存了,最早可以做额外测试的时间是周一早上。
TIdStreamSize
是D6+中的
Int64
。动态数组的长度和索引使用
NativeInt
,因此在32位系统上使用
Integer
,在64位系统上使用
Int64
。但是
TStream.Read()
使用
Longint
进行字节计数,并且
Longint
在大多数平台上是32位的(iOS 64位正在改变这一点)。因此,可能
ReadLnFromStream()
需要将
LBufSize
声明为
NativeInt
,以匹配RTL并避免不必要的转换,即使一次只读取2K?我在IdGlobal中看到一些其他函数正在使用
TIdStreamSize
,其中
NativeInt
可能更有意义。此更改已签入Indy的SVN。