【问题标题】:Delphi 2007 and Indy10 compile error in IdGlobalDelphi 2007 和 Indy10 在 IdGlobal 中编译错误
【发布时间】: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


【解决方案1】:

我不知道这种情况何时以及为何发生了变化,但我遇到了同样的问题(Delphi 2007)。似乎 ReadTIdBytesFromStream 期望将 int64 (TIdStreamSize) 作为 Count 参数传递,但传递的变量 (LBufSize) 是整数。

这似乎会导致编译器出现相当大的问题,并引发内部错误。我浏览了 Indy 代码,直到找到其他没有产生错误的函数调用示例。

我在 TIdHashIntf.GetHashBytes 方法中找到了这段代码的 sn-p 并从中借用了

 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 再次构建和遵守。

据我所知,此更改不会影响任何事情(除了修复损坏的构建),但我可以理解它有点 WTF。无需深入探讨为什么某些变量是 int、其他是 int64 而其他变量是 TIdStreamSize 的原因,这是我能做的最好的事情。也许雷米可以启发我们所有人。

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

【讨论】:

  • 此更改已签入 Indy 的 SVN。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-07
  • 1970-01-01
  • 2016-12-15
  • 1970-01-01
相关资源
最近更新 更多