Delphi – 让Allen Bauer的TMulticastEvent工作

前端之家收集整理的这篇文章主要介绍了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}编译器指令和重建的堆栈框架一样简单。

感谢梅森帮助我得到这个答案。

猜你在找的Delphi相关文章