我一直在摆弄周围与Allen Bauer的代码的通用多播事件调度程序(见他关于它的博客文章在这里).
他提供了足够的代码让我想要使用它,不幸的是他没有发布完整的源代码.我有一个bash让它工作,但我的汇编技能是不存在的.
我的问题是InternalSetDispatcher方法.天真的方法是使用与其他InternalXXX方法相同的汇编程序:
procedure InternalSetDispatcher;
begin
XCHG EAX,[ESP]
POP EAX
POP EBP
JMP SetEventDispatcher
end;
Run Code Online (Sandbox Code Playgroud)
但这用于具有一个const参数的过程,如下所示:
procedure Add(const AMethod: T); overload;
Run Code Online (Sandbox Code Playgroud)
SetDispatcher有两个参数,一个是var:
procedure SetEventDispatcher(var ADispatcher: T; ATypeData: PTypeData);
Run Code Online (Sandbox Code Playgroud)
所以,我认为堆栈会被破坏.我知道代码在做什么(通过弹出对self的隐藏引用来清理堆栈帧从调用到InternalSetDispatcher,我假设返回地址),但我只是无法弄清楚那个小小的汇编程序来获取整个代码事情进行着.
编辑:只是为了澄清,我正在寻找的是我可以用来使InternalSetDispatcher方法工作的汇编程序,即汇编程序用两个参数清理一个过程的堆栈,一个是var.
编辑2:我已经修改了一下这个问题,感谢梅森到目前为止的答案.我应该提到上面的代码不起作用,并且当SetEventDispatcher返回时,会引发AV.