我已经厌倦了Allen Bauer的一个通用组播事件调度程序的代码(参见他的博客文章
here)。
他给了足够的代码让我想使用它,不幸的是他还没有发布完整的源代码。我有一个bash,让它上班,但我的汇编技能是不存在的。
我的问题是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);
所以,我认为堆栈会被破坏。我知道代码正在做什么(通过弹出隐藏的引用到self来清理从InternalSetDispatcher调用的堆栈帧,我假设返回地址),但是我无法弄清楚那一点汇编程序能够得到整体事情去了
编辑:只是为了澄清,我正在寻找的是汇编程序,我可以使用它来使InternalSetDispatcher方法工作,即汇编器清除具有两个参数的一个过程的堆栈,一个var。
编辑2:我已经修改了一些问题,谢谢你,梅森的回答到目前为止。我应该提到上面的代码不起作用,当SetEventDispatcher返回时,AV被引发。