PUSH EDI XCHG EAX,ESI JMP @@haveVMT@@outerLoop: MOV ESI,[ESI]@@haveVMT: MOV EDI,[ESI].vmtDynamicTable TEST EDI,EDI JE @@parent MOVZX ECX,word ptr [EDI] PUSH ECX ADD EDI,2 REPNE SCASW JE @@found POP ECX@@parent: MOV ESI,[ESI].vmtParent TEST ESI,ESI JNE @@outerLoop JMP @@exit
@@found: POP EAX ADD EAX,EAX SUB EAX,ECX { this will always clear the Z-flag ! } MOV ESI,[EDI+EAX*2-4]
@@exit: POP EDIend; 这里多说一句,看 System.GetDynaMethod 的代码简直就像在欣赏一件艺术品,代码被 Borland 的工程师优化得无可挑剔,其中用到了不少技巧,你需要慢慢体会,总之好棒! 至于象 TMyObject 中类似 WMCommand 的方法通常是由 TObject.Dispatch 来进行消息派发的,原理完全同于上面的过程,只是在 DMT 中检索的是消息 ID 而不是方法编号。具体看 TObject.Dispatch 源码及我的《Delphi 的消息机制学习笔记》。
参考文献
1. 李维.《深入核心 -- VCL架构剖析》第二章,2004.1
2. savetime."Delphi 的对象机制浅探", Jan 2004
3. 李战.《悟透delphi》之第二章 --- 《DELPHI的原子世界》
4. Ray Lischner.《Delphi in a Nutshell》,2000
上一页 [1] [2]
Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved. 闵涛 E_mail:admin@mintao.net(欢迎提供学习资源)
鄂公网安备 42011102001154号
站长:MinTao ICP备案号:鄂ICP备11006601号-18