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;
其它的与汇编相同
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;
其它的与汇编相同
),如果不是,则检查祖先类型的消息处理程序,这个过程一直持续到找到为止,如果真的最后还找不到,就调用DefaultHander(就是汇编中的@@default)
JE @@default表示Message头两个字节为0,肯定不存在此ID,所以跳转;
CMP SI,0C000H
JAE @@default超出消息ID范围,也跳转。
这是我的理解,希望对你有帮助。