Я обманывал код Allen Bauer для универсального диспетчера событий многоадресной рассылки (см. его сообщения в блоге об этом здесь).
Он дает достаточно кода, чтобы заставить меня хотеть его использовать, и, к сожалению, он не опубликовал полный источник. У меня было bash, чтобы заставить его работать, но мои навыки ассемблера не существуют.
Моя проблема - метод InternalSetDispatcher. Наивный подход заключается в использовании того же ассемблера, что и для других методов InternalXXX:
procedure InternalSetDispatcher;
begin
XCHG EAX,[ESP]
POP EAX
POP EBP
JMP SetEventDispatcher
end;
Но это используется для процедур с одним константным параметром, например:
procedure Add(const AMethod: T); overload;
И SetDispatcher имеет два параметра: один var:
procedure SetEventDispatcher(var ADispatcher: T; ATypeData: PTypeData);
Итак, я предполагаю, что стек будет поврежден. Я знаю, что делает код (очистка фрейма стека от вызова InternalSetDispatcher путем всплытия скрытой ссылки на себя, и я предполагаю обратный адрес), но я просто не могу понять, что немного ассемблера, чтобы получить весь предмет собирается.
EDIT: просто чтобы уточнить, я ищу ассемблер, который я мог бы использовать, чтобы заставить метод InternalSetDispatcher работать, т.е. ассемблер для очистки стека процедуры с двумя параметрами, один из var.
EDIT2: Я немного изменил вопрос, спасибо Мейсону за его ответы до сих пор. Я должен упомянуть, что приведенный выше код не работает, и когда SetEventDispatcher возвращается, AV поднимается.