AlekXL
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Frodo_Torbins Цитата: это не то. Явно ты не знаешь, как указатели на методы реализованы в крестах. 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 Цитата: да, с RTTI можно многое сотворить. Но, во-первых вызов медленный, во-вторых, весь бинарник будет как на блюдечке, легко дизассемблироваться. | Всего записей: 792 | Зарегистр. 24-04-2008 | Отправлено: 09:42 05-07-2013 | Исправлено: AlekXL, 13:06 05-07-2013 |
|