【发布时间】:2015-02-20 16:58:34
【问题描述】:
我刚刚将我的 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。
【问题讨论】:
-
仅供参考,第 8633 行是
LBufSize := IndyMin(LStrmSize - LStrmPos, LBUFMAXSIZE);您引用的行是第 8634 行。那么哪一行是实际问题呢?我唯一能想到的是,这两行都涉及 IntegerInt64 转换,但我无法想象编译器会因此而窒息,尤其是如果它以前可以工作的话。 -
但是不管怎样,虽然在过去的 2 个月里
IdGlobal.pas发生了很多变化(主要是为 iOS 64 位做准备),但没有一个变化应该像这样影响ReadLnFromStream().但这是一个内部错误,这意味着即使在编译器到达ReadLnFromStream()之前,任何东西都可能使编译器进入错误状态。我没有安装 D2007,所以我无法自己解决问题。如果您可以缩小修复范围,可以将其发送给我进行检查。 -
出于好奇,如果将这行:
LBufSize := IndyMin(LStrmSize - LStrmPos, LBUFMAXSIZE);更改为:LBufSize := Integer(IndyMin(LStrmSize - LStrmPos, LBUFMAXSIZE));,是否还会出现错误?或者将ReadTIdBytesFromStream()改为使用Integer而不是TIdStreamSize? -
@RemyLebeau - LBufsize 被声明为整数,ReadTIdBytesFromStream 需要一个 TIdStreamSize,但调用一个需要整数的类方法。我想我正在查看 8634,将 LBufSize 更改为 TIdStreamSize 修复了它,对任何错误表示歉意,我现在要记忆犹新了,最早可以在星期一早上进行额外测试。
-
TIdStreamSize在 D6+ 中是Int64。动态数组使用NativeInt作为其长度和索引,因此Integer在32 位系统上和Int64在64 位系统上。但是TStream.Read()使用Longint作为其字节数,Longint在大多数平台上是 32 位的(iOS 64 位正在改变这一点)。所以也许ReadLnFromStream()需要将LBufSize声明为NativeInt以匹配RTL 并避免不必要的转换,即使一次只读取2K?我在 IdGlobal 中看到其他一些使用TIdStreamSize的函数,其中NativeInt可能更有意义。
标签: delphi delphi-2007 indy10