我在动态调用Dll时候,如下例:
type
  TaClass= procedure;stdcall;
var
 hnd:Thandle;
 aClass:TaClass;
begin
 hnd := LoadLibrary('PrjDll.dll')  ;
 aClass :=  GetProcAddress(hnd,'ShowDll');//疑问在此
 aClass;
 FreeLibrary(hnd);
end;我用@aClass :=  GetProcAddress(hnd,'ShowDll')一样可以调用成功,
aClass是一个指针,而@aClass是取这个指针的地址,为什么
aClass :=  GetProcAddress(hnd,'ShowDll')

@aClass :=  GetProcAddress(hnd,'ShowDll')
都可以呢?

解决方案 »

  1.   

    Delphi做的处理,它会根据情况决定是使用指针还是指针的值
      

  2.   

    delphi中函数或过程调用可以省略括号,
    这样一来在给函数或过程类型赋值的时候便可能会造成混乱,如:
    type
      TFunc = function: Pointer;
    var
      a, b: TFunc;
    begin
      a := b; // 编译器不知到底该编译成 a := b() 还是 a := Addr(b)所以delphi规定,
    对这种类型的变量赋值加上@操作符限定,

      @a := @b; // 这样便不会再引发岐义
    如果直接取a本身的地址需要用两个@,即 @@a
      

  3.   

    难道是说对于过程指针a 和 @a是等同的吗?
    而@@a才是指针a的地址吗?》