class procedure TList.Error(const Msg: string; Data: Integer);
function ReturnAddr: Pointer;
asm
MOV EAX,[EBP+4]
end;
begin
raise EListError.CreateFmt(Msg, [Data]) at ReturnAddr;
end;
今天上午研究amingoo的怎么访问类的私有成员,涉及到了list删除函数delete,首先判断删除的项是否存在,如果不存在则调用error函数,提示异常。
Error函数中的内部函数ReturnAddr,代码很简单,返回的是下条指令的地址即ebp+4,函数返回时通过ret指令得到继续执行得下一条指令的代码就是通过ebp+4得到的。进入子过程前,先将EIP压栈,从子过程返回时,从堆栈返回地址继续执行。
borland的东西果然精捍,看来我得多看看vcl源码了.