2015-04-03 67 views

回答

2

错误消息表明您正在执行混合有符号和无符号操作数的整数运算。唯一的整数运算是在这里:

HInstance + PImageDosHeader(HInstance)^._lfanew 

第一个操作数是无符号的,第二个签订后,即使它必须为正。

您可以使用强制转换抑制警告。最好在未签名的上下文中执行算术,因此避免范围检查错误。因此,投周围放置第二个操作数:

HInstance + NativeUInt(PImageDosHeader(HInstance)^._lfanew) 

HInstance + Cardinal(PImageDosHeader(HInstance)^._lfanew) 
如果你有一个旧德尔福不具有 NativeUInt

但是,你实际上是在执行指针运算,所以我会写这样的:

PByte(HInstance) + PImageDosHeader(HInstance)^._lfanew 

PAnsiChar(HInstance) + PImageDosHeader(HInstance)^._lfanew 

在其中PByte不支持算术旧的德尔福版本。

0

_lfanew字段是LongIntHInstance变量可能是THandle,它是Cardinal或某些等效类型的别名。有你的签名和无签名的类型。

总和应该算什么类型?可能值的范围比THandle的尺寸宽一位。 (一个m位数和一个n位数的和之和 - 位数最多需要max(m, n)位)。所涉及的两种类型都不够大,因此编译器将它们推广到更宽的类型,以容纳满范围。

你知道这些编译器没有的变量的范围。特别是,您知道_lfanew是以HInstance为基数的内存范围的偏移量。只要没有文件损坏的HInstance_lfanew总和将是一个有效的地址,所以你可以放心类型转换_lfanew无符号类型与信心之和不溢出:

Result := PImageNtHeaders(HInstance + UIntPtr(PImageDosHeader(HInstance)^._lfanew)) 
    ^.FileHeader.TimeDateStamp/SecsPerDay + UnixDateDelta; 

如果您的Delphi版本提供,请使用UIntPtr。否则,NativeUIntCardinal会做。

+0

第二段并不能证明警告。即使这两种类型相同,添加也会溢出。我认为这个警告实际上是因为编译器没有理由为表达式选择一种类型。表达式是a + b。 a + b应该具有a的类型还是b的类型? – 2015-04-03 19:43:20