加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Delphi – 让Allen Bauer的TMulticastEvent工作

发布时间:2020-12-15 10:15:34 所属栏目:大数据 来源:网络整理
导读:我已经厌倦了Allen Bauer的一个通用组播事件调度程序的代码(参见他的博客文章 here)。 他给了足够的代码让我想使用它,不幸的是他还没有发布完整的源代码。我有一个bash,让它上班,但我的汇编技能是不存在的。 我的问题是InternalSetDispatcher方法。天真的
我已经厌倦了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}编译器指令和重建的堆栈框架一样简单。

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读