Delphi – 让Allen Bauer的TMulticastEvent工作
我已经厌倦了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被引发。 解决方法
答案是在Web上完成了大量的运行之后,汇编程序假定在调用InternalSetDispatcher时存在一个堆栈框架。
似乎没有为调用InternalSetDispatcher生成一个堆栈帧。 因此,修复与使用{$ stackframes on}编译器指令和重建的堆栈框架一样简单。 感谢梅森帮助我得到这个答案。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |