Delphi 2007和Indy10在IdGlobal中编译错误

我刚刚将我的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 .

回答(1)

3 years ago

我不知道何时以及为什么会改变但我有同样的问题(Delphi 2007) . 似乎ReadTIdBytesFromStream期望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));

而现在Indy再次 Build 并遵守 .

据我所知,这个改变不会影响任何东西(除了修复破坏的构建),但我可以理解它有点像WTF . 如果不深入了解为什么有些变量是int,有些是int64而有些则是TIdStreamSize,这是我能做的最好的 . 也许雷米可以启发我们所有人 .

顺便提一下,我注意到如果在调试模式下编译,则不会发生致命的编译器错误 .