proc本身是函数调用, 相当于:
call procaddress
意思是将proc所包含的地址作为函数调用
而用@proc相当于addr(proc), 意思是取proc所包含的函数调用的地址
而@@proc相当于取这个函数调用地址在内存中存放的地址. 画个图就比较容易理解了:
type TProc=function SetInt:integer;
var proc:tproc;
$00401021(数据段,proc变量,4 bytes function pointer):
Proc [$0020103c]
|
| 调用
|
V
$0020103C(SetInt的代码段):
i:=100;
result:=i;
可以看出, proc是在数据段的, 它所在的地址是$00401021, 它的内容是
$0020103C, 因为是函数类型的变量, 所以直接应用的时候会自动跳转到
它的内容所在的地址, 并作为代码来执行, 得到的是返回值.
@proc得到的是函数入口$0020103C所在的地址, 即$0020103C, 而
@@proc是指保存$0020103C的变量所在的地址, 即proc在数据段中的地址,
就是$00401021