IdGlobal中的Delphi 2007和Indy10编译错误
我刚刚将我的Indy10安装更新为最新版本(5260),现在我在尝试编译从电子邮件服务器接收电子邮件的Windows服务时出错 [DCC错误]IdGlobal.pas(8657):F2084内部错误:C4963 恢复到5239版不会导致问题 问题似乎出现在第8633行的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位问题,是否有其他人遇到过
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。