这是调用程序单元:
unit Unit1;interfaceuses
  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这个单元的时候不论执行那一个方法,程序退出的时候都会报错,就算什么都不做,程序运行起来,直接退出都报错,错误也是无效的指针操作;

解决方案 »

  1.   

    >>Procedure SetData_Pointer(P: Pointer);Stdcall;
    這個有問題, 正常要在調用端, 也就是 exe 中申請內存, 傳到dll中直接付值
      

  2.   

    內存分配一般用 new or getmem來操作, 而不是你用的SetLength
      

  3.   

    ShareMem主要是用于string字符串内存的管理,你的dll中使用 的结构体没有字符串成员,没有必要ShareMem单元。
      

  4.   

    >>>
      New(aa);
      SetDAtaArr_P(aa);你的想法是在调用方申请一块内存,然后就把指针传入dll中的函数,想法没有问题是没有错,只是觉得怪怪的。  SetDAtaArr_P(aa);这个函数可以 不用要,你直接就把aa这个变量的地址传过去就ok了,,比如:
    Dll_func(@aa)
      

  5.   

    to:  mdf2008(十二乐坊的FANS)
    SetDAtaArr_P这个函数的参数是PTIDDataArr,说的了其实也是一个指针,如果不NEW的话是不行的,传@AA就是指针的指针了,