Получение работы Аллена Бауэра TMulticastEvent <T>
Я возился с кодом Аллена Бауэра для универсального диспетчера многоадресных событий (см. Его посты об этом в блоге).Вот).
Он дает достаточно кода, чтобы я захотел его использовать, и, к сожалению, он не опубликовал полный исходный код. У меня была попытка заставить его работать, но мои навыки ассемблера отсутствуют.
Моя проблема заключается в методе InternalSetDispatcher. Наивный подход заключается в использовании того же ассемблера, что и для других методов InternalXXX:
procedure InternalSetDispatcher;
begin
XCHG EAX,[ESP]
POP EAX
POP EBP
JMP SetEventDispatcher
end;
Но это используется для процедур с одним параметром const, например так:
procedure Add(const AMethod: T); overload;
И SetDispatcher имеет два параметра, один из которых var:
procedure SetEventDispatcher(var ADispatcher: T; ATypeData: PTypeData);
Итак, я предполагаю, что стек будет поврежден. Я знаю, что делает код (очищает кадр стека от вызова InternalSetDispatcher, выдвигая скрытую ссылку на себя, и я предполагаю адрес возврата), но я просто не могу понять, что немного ассемблера, чтобы получить весь дело идет
РЕДАКТИРОВАТЬ: просто чтобы уточнить, что я ищу, это ассемблер, который я мог бы использовать, чтобы заставить работать метод InternalSetDispatcher, то есть ассемблер, чтобы очистить стек процедуры с двумя параметрами, один из которых var.
РЕДАКТИРОВАТЬ 2: Я немного исправил вопрос, спасибо Мейсон за его ответы до сих пор. Я должен упомянуть, что приведенный выше код не работает, и когда SetEventDispatcher возвращается, AV поднимается.