我正在将一些C#代码翻译成Delphi,我明白了(msg = TMsg):
(int)msg.LParam
只是一个演员(如果我错了请纠正我),但以下令人难以置信:
Marshal.ReadInt32( (IntPtr)msg.WParam, 4 )
有人可以澄清一下吗?
答案 0 :(得分:8)
它只是从指针读取一个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
已经这样做了。