type TMyZip_AddFile=Function (SrcFile,ZipFile:pchar):integer;stdcall;var
  MyZip_AddFile:TMyZip_AddFile;
  LibHandle:THandle;
begin    LibHandle:=LoadLibrary('MyZip.dll');
    MyZip_AddFile:=GetProcAddress(LibHandle,'MyZip_AddFile');//---1
    @MyZip_AddFile:=GetProcAddress(LibHandle,'MyZip_AddFile');//---2
请问1,和2之间的有区别吗?我调用下来结果是一样的,语法怎么解释,编译器为什么没有抱错,我以前用第一种方式调用DLL就抱错?

解决方案 »

  1.   

    MyZip_AddFile本来就是一个指针嘛!
      

  2.   

    我知道是指针啊,但是@MyZip_AddFile不是它自己的地址啊
      

  3.   

    没有,对于普通的过程指针,赋值时的这两种写法,编译器认为相同。但方法指针则不同。比如:
    var
      E: TNotifyEvent;  @E := Button2Click; //非法,
      E := Button2Click;  //合法————————————————————————————————————
    宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
    ————————————————————————————————————
      

  4.   

    请教: lxpbuaa(桂枝香在故国晚秋)
    @MyZip_AddFile是什么?
      

  5.   

    方法指针还包含一个Self指针!
      

  6.   

    1.你说的两种方法都可以通过,并且应该是过程指针,确实没有问题,资料上有的。2.如果你想取得过程变量的地址,请用如下方法:
    @@Procedure_xxx;3.过程指针与方法指针永远都是不兼容的,也就是说不能互相赋值。
    方法指针就像它的名字说的那样,它是属于某个类的。所以它的定义与一般过程不同:
    比如:
    type TKeyPressEvent = procedure (Sender: TObject; var Key: Char) of object;
    下面考虑一个例子:
    private
      MyButton : TButton;
      MyProcedure : TKeyPressEvent;
      MyAssignProcedure;
    TForm1.MyProcedure(Sender: TObject; var Key: Char) of object;
    begin
      ...
    end;
    TForm1.FormCreate(Sender : TObject);
    begin
      MyButton := TButton.Create(Application);
      with MyButton do
      begin
        self.Parent := self;
        self.Caption := 'MyTestButton';
        self.OnKeyPress:= MyProcedure;          //方法指针赋值
        self.SetBounds(...);
        ...
      end;
    end;
    并且方法指针不止是可以传给同一窗体的组件,只要可以赋值的地方都可以实现。比如:
    TForm1.AssignProcedure;
    beign
      with TForm2.Create(nil) do
      begin
        ...
        OnPressKey := MyProcedure;      //方法指针赋值
        ...
        ShowModal;
        Free;
      end;
    end;