Это просто читает 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
уже сделает это.