Что означает C # Marshal.ReadInt32 (IntPtr) в Delphi? - PullRequest
3 голосов
/ 21 марта 2012

Я перевожу некоторый код C # в Delphi, я понимаю, что (msg = TMsg):

(int)msg.LParam

это просто приведение (пожалуйста, исправьте меня, если я ошибаюсь), однако следующие проблемымой разум:

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

Может кто-нибудь объяснить это?

1 Ответ

8 голосов
/ 21 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...