![](/img/trans.png)
[英]How does Marshal.ReadInt32 etc. differ from unsafe context and pointers?
[英]What does C#'s Marshal.ReadInt32(IntPtr) mean in Delphi?
我正在將一些C#代碼翻譯成Delphi,我理解(msg = TMsg):
(int)msg.LParam
只是一個演員(如果我錯了請糾正我),但以下令人難以置信:
Marshal.ReadInt32( (IntPtr)msg.WParam, 4 )
有人可以澄清一下嗎?
它只是從指針讀取一個4字節的整數。 在托管的.net代碼中,您沒有指針(除非您使用不安全的代碼),因此框架提供了幫助在本機和托管世界之間互操作的工具。 MSDN上.net庫的文檔是全面的,當然,它描述了Marshal.ReadInt32
。
這里額外的復雜性是有4個字節的額外偏移。 實際上,指針可能指向一個結構,這個代碼在結構的偏移量4處挑選出整數值。 對於代碼來說,這絕對是最可能的解釋。
現在,字面翻譯將是:
PInteger(msg.WParam+4)^
但你可以像這樣用Delphi寫它:
type
TMyRecord = record
i1: Integer;
i2: Integer;
end;
PMyrecord = ^TMyRecord;
....
value := PMyRecord(msg.WParam)^.i2;
如果你知道這個WParam
與哪個消息有關,那么你也會知道在這里使用的真實record
是什么。 因此,您不需要定義專用記錄,因為Windows.pas
已經這樣做了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.