我正在将一些C#代码翻译成Delphi,理解以下内容(msg = TMsg):
(int)msg.LParam
我认为这只是一个转换(如果我有错误,请纠正我),然而以下内容让我困惑:
Marshal.ReadInt32( (IntPtr)msg.WParam, 4 )
有人可以解释一下这个吗?
这只是从指针中读取一个4字节的整数。在托管的.net代码中,你没有指针(除非你使用不安全的代码),因此框架提供了工具来帮助本地代码和托管世界之间的互操作。.net库的MSDN文档是全面的,并且当然描述了Marshal.ReadInt32
。
这里的额外复杂性在于有额外的4字节偏移量。实际上,指针可能指向一个结构体,而这段代码正在挑选结构体偏移量为4的整数值。这很可能是代码之所以是这样的最有可能的解释。
现在,字面翻译如下:
PInteger(msg.WParam+4)^
type
TMyRecord = record
i1: Integer;
i2: Integer;
end;
PMyrecord = ^TMyRecord;
....
value := PMyRecord(msg.WParam)^.i2;
WParam
与哪个消息相关,则您也会知道在此处使用的真实 record
是什么。因此,您不需要定义专用记录,因为 Windows.pas
已经这样做了。PInteger(msg.WParam+4)^
。 - David Heffernan
int
的指针中读取一个int
。看起来是作为Windows消息的一部分,可能在WndProc
覆盖中。 - JodrellMarshal.ReadInt32
的文档也可能无法完全解释清楚。上下文非常重要。 - David Heffernan