var
  TBSQ_TestT=function:TUser;stdcall;
/////////////////////////////////////////
procedure TForm1.Button2Click(Sender: TObject);
var
  FHandle           : THandle;
  FBSQ_CheckLogin      : TBSQ_TestT;
  users:Tuser;
begin  FHandle := LoadLibrary('BSQ.dll');
  if FHandle <> 0 then
    begin
      @FBSQ_CheckLogin := GetProcAddress(FHandle, 'BSQ_TestT');
      if @FBSQ_CheckLogin <> nil then
          begin
            users:=FBSQ_CheckLogin;
            Memo1.Lines.Add(users.username);
          end
      else
        showmessage('加载函数失败');
    end
  else
        showmessage('加载dll失败');
  FreeLibrary(FHandle);
end;
=================================================
经过测试 把  FreeLibrary(FHandle); 注释掉就可以正常
初步估计应该是在释放 dll 的时候导致释放资源出错。
但百思不得其解。我在dll中定义的 TestT函数没有啥资源需要释放啊
难道要释放掉 定义的 user:Tuser?????
下面附上  dll中TestT 的定义
function BSQ_TestT:TUser;stdcall; 
var 
  user:TUser; 
begin 
  user.Uid:=1; 
  user.username:='十七郎'; 
  user.gender:='男'; 
  result:=user; 
end; 

解决方案 »

  1.   

    dll的程序interface
    type
      TUser=record
        Uid:integer;
        username:string[100];
        face:string[100];
        gender:string[100];
      end;
      PTUser=^TUser;  function BSQ_TestT:PTUser;stdcall;implementationfunction BSQ_TestT:PTUser;stdcall;
    var 
      user:PTUser;
    begin
      new(user);
      user^.Uid:=1;
      user^.username:='十七郎';
      user^.gender:='男';
      result:=user;
      dispose(user);
    end;调用  users:=BSQ_TestT;
      Memo1.Lines.Add(users^.username);解释:dll的参数传递最好用指针
          字符串最好用pchar或者shortstring
      

  2.   

    dll中定义两个接口函数和Tuser变量,如:
    aUser:Tuser;  function SetParams(aParams:Tuser):Boolean; export; stdcall;
      function Execute(AHandle:HWnd):Boolean; export; stdcall;......
      function SetParams(aParams:Tuser):Boolean; 
      begin
        aUser:=aParams;
      end;  function Execute(AHandle:HWnd):Boolean;
      begin
        user.Uid:=1; 
        user.username:='十七郎'; 
        user.gender:='男'; 
      end;
    exe中执行两次调用,第一次调用SetParams,第二次调用Execute
      

  3.   

    刚才上面的调用函数写错了,修正一下dll中定义两个接口函数和Tuser变量,如: 
    aUser:Tuser;   function SetParams(aParams:Tuser):Boolean; export; stdcall; 
      function Execute(AHandle:HWnd):Boolean; export; stdcall; ...... 
      function SetParams(aParams:Tuser):Boolean; 
      begin 
        aUser:=aParams; 
      end;   function Execute(AHandle:HWnd):Boolean; 
      begin 
        auser.Uid:=1; 
        auser.username:='十七郎'; 
        auser.gender:='男'; 
      end; 
    exe中执行两次调用,第一次调用SetParams,第二次调用Execute
      

  4.   

    SuperTitan001
    你的方法可行。但有点问题
    在dll中
    function BSQ_TestT:PTUser;stdcall; 
    var 
      user:PTUser; 
    begin 
      new(user); 
      user^.Uid:=1; 
      user^.username:='十七郎'; 
      user^.gender:='男'; 
      result:=user; 
      dispose(user);   
    end; 
    =======================================
    dispose(user);   //把这句注释掉就能返回数据。
    但不注销 又不能释放new以后的user
    是个麻烦事情
      

  5.   

    SuperTitan001
    你的方法可行。但有点问题
    在dll中
    function BSQ_TestT:PTUser;stdcall; 
    var 
      user:PTUser; 
    begin 
      new(user); 
      user^.Uid:=1; 
      user^.username:='十七郎'; 
      user^.gender:='男'; 
      result:=user; 
      dispose(user);   
    end; 
    =======================================
    dispose(user);   //把这句注释掉就能返回数据。
    但不注销 又不能释放new以后的user
    是个麻烦事情
      

  6.   

    这里的user是全局变量不是局部变量,且不需要Create,也不需要dispose(user); 
      

  7.   

    这里的user由主调函数申请并Create,也在主调程序中dispose(user); 
    即下面两句都在主调程序exe里头,不在DLL中。
    new(user);
    dispose(user); 
      

  8.   

    不对哦! 黑鹰。
    new(user) 只有在dll中才有效。在主调函数中是无效的
      

  9.   

    我不明白为什么你会调不出数据,我上面的例子用的静态调用,难道非的给你写个动态调用?
    估计是你套用原来的动态调用吧,有时候自己多试试TBSQ_TestT=function:PTUser;stdcall;
    procedure TForm1.Button1Click(Sender: TObject);
    var
      users:PTUser;
      FHandle:THandle;
      FBSQ_CheckLogin:TBSQ_TestT;
    begin
      FHandle := LoadLibrary('BSQ.dll');
      if FHandle <> 0 then
        begin
          @FBSQ_CheckLogin := GetProcAddress(FHandle, 'BSQ_TestT');
          if @FBSQ_CheckLogin <> nil then
              begin
                users:=FBSQ_CheckLogin;
                Memo1.Lines.Add(users^.username);
              end
          else
            showmessage('加载函数失败');
        end
      else
            showmessage('加载dll失败');
      FreeLibrary(FHandle);
    end;