Внутреннее (память) представление TProc и ссылок вообще - PullRequest
5 голосов
/ 04 июля 2011

Кто-нибудь здесь знает, как Delphi представляет ссылку на процедуру?

например

var
  proc: TProc;
...
proc = procedure begin beep end;

Что мы получили в "proc"?

Я знаю, что для «переменной метода» представление памяти составляет 4 байта для «адреса процедуры», за которым следуют 4 байта для «адреса объекта», но для «ссылки на процедуру» это несколько иное, и я не могу понять это вне.

Причина, по которой я этого хочу, заключается в том, что у меня есть какой-то устаревший код, который я хочу, чтобы он работал со ссылками.

Кто-нибудь знает что-нибудь об этом?

1 Ответ

10 голосов
/ 04 июля 2011

Ссылки на методы реализованы в виде интерфейса в стиле COM с единственным методом с именем Invoke, который имеет ту же сигнатуру, что и ссылка на метод.

Так TProc выглядит так:

type
  TProc = interface(IInterface) // so inherits QI, AddRef, Release
     procedure Invoke;
  end;

Это правильный вопрос, поскольку Delphi может взаимодействовать с продуктом C ++. При использовании ранее существовавшего типа с подсчетом ссылок и идиомы (правила жизни COM) возможно взаимодействие с C ++ на уровне ссылок метода.

Анонимные методы генерируют скрытый класс, который реализует интерфейс, изоморфный эталонному интерфейсу метода, то есть точно такой же формы, но не с той же символьной идентичностью. Скрытый класс не реализует интерфейс ссылки на метод напрямую, потому что может потребоваться реализовать интерфейс несколько раз (один блок может содержать несколько анонимных методов, все из которых назначены местоположениям одного и того же ссылочного типа метода).

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