Obtendo o TMulticastEvent <T> de Allen Bauer
Eu tenho andado por aí com o código de Allen Bauer para um despachante de eventos multicast genérico (veja os posts do blog dele sobre issoAqui).
Ele dá apenas código suficiente para me fazer querer usá-lo, e infelizmente ele não postou a fonte completa. Eu tive uma festa para fazer funcionar, mas minhas habilidades de montadora são inexistentes.
Meu problema é o método InternalSetDispatcher. A abordagem ingênua é usar o mesmo assembler que os outros métodos InternalXXX:
procedure InternalSetDispatcher;
begin
XCHG EAX,[ESP]
POP EAX
POP EBP
JMP SetEventDispatcher
end;
Mas isso é usado para procedimentos com um parâmetro const, como este:
procedure Add(const AMethod: T); overload;
E SetDispatcher tem dois parâmetros, um var:
procedure SetEventDispatcher(var ADispatcher: T; ATypeData: PTypeData);
Então, eu suponho que a pilha seria corrompida. Eu sei o que o código está fazendo (limpando o quadro de pilha da chamada para InternalSetDispatcher, colocando a referência oculta para si e assumindo o endereço de retorno), mas eu simplesmente não consigo descobrir que pouco montador para obter o todo coisa acontecendo.
EDIT: Só para esclarecer, o que estou procurando é o montador que eu poderia usar para obter o método InternalSetDispatcher para trabalhar, ou seja, o montador para limpar a pilha de um procedimento com dois parâmetros, um var.
EDIT2: Eu alterei a questão um pouco, obrigado a Mason por suas respostas até agora. Eu devo mencionar que o código acima não funciona, e quando SetEventDispatcher retorna, um AV é gerado.