2009-07-27 87 views
0
var Buffer: TMemoryStream 

代碼:添加指針

Move((PByte(Buffer.Memory)+Buffer.Position)^, Buffer.Memory^, Buffer.Size - Buffer.Position); 

不幸的是這是不可能的:操作並不適用於這種類型的操作數。

那麼我怎樣才能得到一個MemoryBuffer的起點呢?

+0

什麼是Buffer的定義? – sharptooth 2009-07-27 09:31:01

回答

5

只能加/減整數字符指針。從德爾福幫助:

您可以使用+和 - 運營商 增量和 一個字符指針遞減的偏移量。您也可以使用 - 計算兩個字符指針的偏移量之間的差異。 適用以下規則。

如果我是一個整數並且P是一個 字符指針,那麼P + I將I 加到P給出的地址上;也就是它 返回一個指向P.之後的地址I 個字符的指針(表達式I + P等於P + I。)P-I從 P給出的地址減去I;也就是說,它返回一個指向 指針前的地址I字符。012h這對PChar指針是正確的;對於 PWideChar指針P + I增加 一下SizeOf(WideChar)至P.

如果P和Q都是字符 指針,那麼P - Q計算由P(高位地址)給定 的地址之間的差 和Q給出的 地址(地址較低的 地址);也就是說,它返回一個 整數,表示P和Q之間的字符數 。P + Q爲 未定義。

試試這個:

Move((PAnsiChar(Buffer.Memory)+Buffer.Position)^, Buffer.Memory^, Buffer.Size - Buffer.Position); 
+4

使用PAnsiChar,而不是PChar,以免下次升級Delphi時,代碼突然出現奇怪的錯誤。 – 2009-07-27 14:57:13

1

您鑄造Buffer.Memory到PBYTE,想添加一個Int64值。這是行不通的(德爾福是非常嚴格的,你用指針做什麼)。試試這個:

Move(Pointer(Int64(Buffer.Memory)+Buffer.Position)^, Buffer.Memory^, Buffer.Size - Buffer.Position); 

這個工程:

Move(PAnsiChar(Buffer.Memory)[Buffer.Position], Buffer.Memory^, Buffer.Size - Buffer.Position); 

這 「應該」 在2009年德爾福與POINTERMATH工作:

Move(PByte(Buffer.Memory)[Buffer.Position], Buffer.Memory^, Buffer.Size - Buffer.Position); 
+0

後一個例子只有在內存的類型是PByte時纔有效。它不是'指針'嗎? – 2009-07-27 14:58:42

+0

我向PByte添加了一個轉換,但是不可能只使用指針? – 2009-07-27 19:02:33

2

我認爲,原代碼與PBYTE應在2009年德爾福工作,因爲它現在有更多類型的啓用指針數學。