Frodo_Torbins Цитата: AlekXL
http://docwiki.embarcadero.com/RADStudio/XE4/en/Procedural_Types#Method_Pointers
Но в современных делфях указатели на методы можно объявлять и как анонимы, т к они совместимы: http://docwiki.embarcadero.com/RADStudio/XE4/en/Anonymous_Methods_in_Delphi#Using_Anonymous_Methods
это не то. Явно ты не знаешь, как указатели на методы реализованы в крестах.
valgreesh твой код пригоден, конечно. но
1) не поддерживает полиморфизм
2) грязноват. Непонятно, как будет работать с ARC.
хотелось бы на этапе компиляции выяснять, является ли метод виртуальным, и если да, то пихать VMTOFFSET вместо адреса. А в рантайме уже какой-нибуть оберткой решать, как сделать вызов: напрямую, статически, либо через VMT, либо вообще динамически.
Пока писал, понял, что виртуальный вызов можно сделать через диспетчеризацию message или dispId: вызов виртуальный(вернее, динамический), никаких тебе грязных указателей. Лучше всего, наверное, именно dispId, поскольку он, насколько я знаю, сейчас нигде не используется в стд библиотеках. Только где примерный код такой диспетчеризации?
upd код диспетчеризации в Vcl.OleAuto, оказывается. И действительно, если диспетчеризуемый метод виртуальный, то TAutoEntry.Flags содержит флаг afVirtual=$08;
и вместо прямого адреса дается смещение в VMT. Конечно, automated методы работают за счет своего RTTI, но в отличие от стандартного eRTTI, здесь информация хранится
только о членах, объявленных в области automated.
К тому же этот код работает и на win32, и на ios simulator(стало быть, nextgen ARM компилятор тоже
должен его поддерживать)
deks Цитата: http://docwiki.embarcadero.com/RADStudio/XE4/en/Run-Time_Operations_on_Types#Invoking_Methods
да, с RTTI можно многое сотворить. Но, во-первых вызов медленный,
во-вторых, весь бинарник будет как на блюдечке, легко дизассемблироваться.