2015-04-03 38 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