C#的Marshal.ReadInt32(IntPtr)在Delphi中意味着什么?

时间:2012-03-21 17:43:06

标签: c# delphi

我正在将一些C#代码翻译成Delphi,我明白了(msg = TMsg):

(int)msg.LParam

只是一个演员(如果我错了请纠正我),但以下令人难以置信:

Marshal.ReadInt32( (IntPtr)msg.WParam, 4 )

有人可以澄清一下吗?

1 个答案:

答案 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已经这样做了。