我正在将一些C#代码翻译成Delphi,我理解(msg = TMsg):
(int)msg.LParam
Run Code Online (Sandbox Code Playgroud)
只是一个演员(如果我错了请纠正我),但以下令人难以置信:
Marshal.ReadInt32( (IntPtr)msg.WParam, 4 )
Run Code Online (Sandbox Code Playgroud)
有人可以澄清一下吗?
它只是从指针读取一个4字节的整数.在托管的.net代码中,您没有指针(除非您使用不安全的代码),因此框架提供了帮助在本机和托管世界之间互操作的工具.有关.net库的MSDN文档是全面的,当然也有描述Marshal.ReadInt32.
这里额外的复杂性是有4个字节的额外偏移.实际上,指针可能指向一个结构,这个代码在结构的偏移量4处挑选出整数值.对于代码来说,这绝对是最可能的解释.
现在,字面翻译将是:
PInteger(msg.WParam+4)^
Run Code Online (Sandbox Code Playgroud)
但你可以像这样用Delphi写它:
type
TMyRecord = record
i1: Integer;
i2: Integer;
end;
PMyrecord = ^TMyRecord;
....
value := PMyRecord(msg.WParam)^.i2;
Run Code Online (Sandbox Code Playgroud)
如果您知道这WParam与哪个消息有关,那么您也将知道在record这里使用的是什么.因此,您不需要定义专用记录,因为Windows.pas已经这样做了.