procedure TObject.Dispatch(var Message);
asm  //开始汇编
PUSH ESI 
MOV SI,[EDX]
OR SI,SI
JE @@default
CMP SI,0C000H
JAE @@default
PUSH EAX
MOV EAX,[EAX]
CALL GetDynaMethod
POP EAX
JE @@default
MOV ECX,ESI
POP ESI
JMP ECX@@default://子程
POP ESI
MOV ECX,[EAX]
JMP dword ptr [ECX].vmtDefaultHandler
end;
 
其它的与汇编相同

解决方案 »

  1.   

    我是问dispatch如何派发message到message handler呢?
      

  2.   

    Dispatch仅假设Message的头两个字节包含消息ID,用于确定Dispatch调用的处理程序的整数,消息是否在对象声明的消息处理程序表中呢?如果是,将消息传给对象的对应于当前事件的处理程序(call GetDynaMethod
    ),如果不是,则检查祖先类型的消息处理程序,这个过程一直持续到找到为止,如果真的最后还找不到,就调用DefaultHander(就是汇编中的@@default)
      

  3.   

    OR SI,SI
    JE @@default表示Message头两个字节为0,肯定不存在此ID,所以跳转;
    CMP SI,0C000H
    JAE @@default超出消息ID范围,也跳转。
    这是我的理解,希望对你有帮助。