|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
09.05.2024, 19:04 | #1 |
Регистрация: 25.03.2010
Сообщений: 8
|
Двойное разыменовывание??? Код рабочий, но не понимаю как работает.
Приветствую уважаемые форумчане!
Привожу рабочий код. Но не понимаю как это всё работает, я раньше не встречал символ двойного разыменовывания ^^. Нашел в интернете такую функцию. Код:
Код:
|
09.05.2024, 22:01 | #2 |
Просветитель
Участник клуба
Регистрация: 26.12.2012
Сообщений: 1,844
|
Разыменование — одноместная операция, применяемая к аргументу слева. Несколько операций подряд дают множественное разыменование, по числу знаков: двойное, тройное, и так далее.
Процедура основана на знании внутренних структур типов, генерируемых компилятором. Тип TMethod описан так: Код:
|
10.05.2024, 06:40 | #3 |
Регистрация: 25.03.2010
Сообщений: 8
|
Спасибо за статью, в голове начинает проясняться.
Значит я конвертирую анонимную процедуру в метод. Хотя наверно слово "конвертирую" тут не подходит, я создаю метод из анонимной процедуры. PPVtable это адрес в памяти, по которому находится адрес в памяти по которому находится виртуальная таблица (методов?) (TVtable состоящая из 4х указателей). Проще говоря PPVtable это указатель на указатель на виртуальную таблицу. Отсюда и идут подряд операции разыменовывания ^^ чтобы добраться до виртуальной таблицы без промежуточных переменных. Это вроде понятно. Код:
Код:
Вот тут не понимаю почему [3]? Что является [0], [1], [2], [3]. У нас что [0] это будет адрес начала анонимной процедуры, [1] это адрес Sender:TObject?, [2] - это ... of object? Тут в общем запутался... В строчке Код:
А вот в строчке Код:
Последний раз редактировалось killzone; 10.05.2024 в 06:56. |
10.05.2024, 10:01 | #4 |
Просветитель
Участник клуба
Регистрация: 26.12.2012
Сообщений: 1,844
|
Отладчик у тебя перед глазами, не у меня. Я сам не пишу на модных версиях Delphi, так что не знаю, как оно там внутри. Могу предложить включить в настройках генерацию map-файла с номерами строк (Detailed), а потом посмотреть по адресам. Возможно, в отладочной сборке придется также отключить ASLR (dynamic image base), если не отключено по умолчанию.
|
03.06.2024, 20:39 | #5 | |
personality
Старожил
Регистрация: 28.04.2009
Сообщений: 2,889
|
Цитата:
Касательно индексов - вот статья , в целом верно, что по определённому смещению будет лежать пользовательский метод, но в частном случае надо будет подбирать значение, в зависимости от иерархии классов, возможно где-то и лежит универсальное/вычисляемое значение, тут не знаю. Для анонимки скорее всего верно, т.к. её внутренности определяются версией компилятора, а меняются и того реже. P.S. надо быть аккуратным, используя хаки, например, произойдёт Release вашей анонимки, она managed type with reference counting, а вы держите на неё ссылку в кнопке, всё может упасть, возможно, придётся самому заботиться о подсчете ссылок вручную. А если вы делаете свой класс, то можно воспользоваться советом из https://docwiki.embarcadero.com/RADS...hods_in_Delphi там есть раздел для ивентов, но на стандартную кнопку это, конечно, не распространяется. Последний раз редактировалось phomm; 03.06.2024 в 21:01. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Не понимаю как работает CALL | Bizunov | SQL, базы данных | 0 | 04.06.2013 11:29 |
Что то не понимаю как этот код работает? | Denis19061989 | Помощь студентам | 0 | 26.05.2013 10:33 |
Не работает рабочий код при навеске на другой контрол | samouelson | C# (си шарп) | 3 | 21.06.2012 20:25 |
Разыменовывание итератора | litviak | Общие вопросы C/C++ | 5 | 08.06.2012 14:29 |
Вирус,из-за которого не работает рабочий стол | JerryS | Безопасность, Шифрование | 7 | 13.09.2009 19:54 |