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

Com*_*sNo 3 c# delphi

我正在将一些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)

有人可以澄清一下吗?

Dav*_*nan 8

它只是从指针读取一个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已经这样做了.