关于用DLL传递动态数据组的问题;

                            
这是调用程序单元:   
  unit   Unit1;  
   
  interface  
   
  uses  
      Windows,   Messages,   SysUtils,   Variants,   Classes,   Graphics,   Controls,   Forms,  
      Dialogs,   Unit2,   StdCtrls;  
  type  
      IDData   =   record  
          ID:   Integer;  
      end;  
      TIDDataArr   =   Array   Of   IDData;  
      PTIDDataArr   =   ^TIDDataArr;  
  type  
      TForm1   =   class(TForm)  
          Button1:   TButton;  
          Button2:   TButton;  
          Button3:   TButton;  
          procedure   Button1Click(Sender:   TObject);  
          procedure   Button2Click(Sender:   TObject);  
          procedure   Button3Click(Sender:   TObject);  
      private  
          {   Private   declarations   }  
      public  
          {   Public   declarations   }  
      end;  
   
  var  
      Form1:   TForm1;  
  Procedure   SetData_Pointer(P:   Pointer);Stdcall;   external   'Project2.dll';  
  Procedure   SetDAta_Arr(Var   DataArr:   TIDDataArr);   Stdcall;   external   'Project2.dll';  
  Procedure   SetDAtaArr_P(Var   DataArr:   PTIDDataArr);   Stdcall;   external   'Project2.dll';  
  implementation  
  {$R   *.dfm}  
   
  procedure   TForm1.Button1Click(Sender:   TObject);  
  Var   aa:   TIDDataArr;  
  begin  
      SetData_Pointer(@aa);  
      ShowMessage(IntToStr(aa[0].ID));  
      SetLength(aa,   0);  
  end;  
   
  procedure   TForm1.Button2Click(Sender:   TObject);  
  Var   aa:   TIDDataArr;  
  begin  
      SetDAta_Arr(aa);  
      ShowMessage(IntToStr(aa[0].ID));  
  end;  
   
  procedure   TForm1.Button3Click(Sender:   TObject);  
  Var   aa:   PTIDDataArr;  
  begin  
      New(aa);  
      SetDAtaArr_P(aa);  
      ShowMessage(IntToStr(aa^[0].ID));  
      aa   :=   Nil;  
  end;  
   
  end.  
   
  下面是DLL单元:  
  library   Project2;  
   
  uses  
      SysUtils,  
      ShareMem,  
      Classes;  
  type  
      IDData   =   record  
          ID:   Integer;  
      end;  
      TIDDataArr   =   Array   Of   IDData;  
      PTIDDataArr   =   ^TIDDataArr;  
  {$R   *.res}  
   
  Procedure   SetData_Pointer(P:   Pointer);Stdcall;  
  Begin  
      SetLength(PTIDDataArr(P)^,   2);  
      PTIDDataArr(P)^[0].ID   :=   123;  
      PTIDDataArr(P)^[1].ID   :=   567;  
  End;  
   
  Procedure   SetDAta_Arr(Var   DataArr:   TIDDataArr);   Stdcall;  
  Begin  
      SetLength(DataArr,   2);  
      DataArr[0].ID   :=   55555;  
      DataArr[1].ID   :=   66666;  
  End;  
   
  Procedure   SetDAtaArr_P(Var   DataArr:   PTIDDataArr);   Stdcall;  
  Begin  
      SetLength(DataArr^,   2);  
      DataArr^[0].ID   :=   77777;  
      DataArr^[1].ID   :=   88888;  
  End;  
   
  exports  
      SetData_Pointer,  
      SetDAta_Arr,  
      SetDAtaArr_P;  
  begin  
  end.  
   
   
  问题是我的调用单元中的三个方法调用都没有问题,就是在程序退出的时候不一样,  
  第三个问题不会报错,前两个问题都报无效的指针操作;为什么?????????????????  
  怎么解决??????,  
  还要说明一点就是我在调用程序单元引用ShareMem这个单元的时候不论执行那一个方法,程序退出的时候都会报错,就算什么都不做,程序运行起来,直接退出都报错,错误也是无效的指针操作;

查看回复