我在调用包含ADOQuery组件的DLL后,程序关闭时总会跳出一个内存错误,去掉ADO调用就一切正常,那位大侠做过类似问题的能不能给个提示,万分感激!
已经试过各种方法,就差把ADOQuery从DLL在中去掉了!晕阿! 

解决方案 »

  1.   

    //窗口创建函数
    Function LandFormCreate(Ha:THandle;ADOStr: String;TabName:string;IndexFN:string;
                            UserFN:string;PassFN:string;Ter: string;IntP: TIntP):
                            Boolean;
    var
      LandForm: TStencil_LandForm;
    begin
      Application.Handle := Ha;
      Application.Tag := 0;
      Try
        Application.Initialize;
        LandForm:=TStencil_LandForm.Create(Application);
        Land.AdoCStr := ADOStr;
        Land.IFN := IndexFN;
        Land.UFN := UserFN;
        Land.PFN := PassFN;
        Land.TableName := TabName;
        Land.Term := Ter;
        IntPoint := IntP;
        LandForm.ShowModal;
        result := true;
      Except
        MessageDlg('´´½¨´°¿Úʧ°Ü£¡',mtError,[mbOK],0);
        result := false;
      End;
    end;//调用过程
    type
      TIntP=^Integer;
      TLandFun=Function (Ha:THandle;ADOStr: String;TabName:string;IndexFN:string;
                         UserFN:string;PassFN:string;Ter: string;IntP: TIntP):
                         Boolean;Stdcall;
    var
      Handle: THandle;
      FunPro: TFarProc;
      i:integer;
      IntPoint: TIntP;
    begin
      FunPro := nil;
      i := 0;
      IntPoint := @i;
      Handle := LoadLibrary(DLLPath + 'ProLand.dll');  if Handle > 32 then
      try
        Try
          FunPro := GetProcAddress( Handle,PChar('LandFormCreate') );
        except
          MessageDlg('ÔØÈëDLLº¯Êý´íÎó£¡',mtError,[mbOK],0);
        end;    try
          TLandFun(FunPro)( Finance_MainForm.Handle,
                            DataModule1.ADOQuery1.ConnectionString,'[1860_Op]',
                            'O_id','O_UName','O_PassWord','O_Type='+
                            chr(39) + 'Bursar' + chr(39),IntPoint );
        except
          showmessage('1µ÷Óóö´í£¡');
        end;
      Except
        ShowMessage('2µ÷Óóö´í£¡');
      end;
    end;
      

  2.   

    //DLL中执行函数
    procedure TStencil_LandForm.Land_ButtonClick(Sender: TObject);
    var
      pwd: string[32];
    begin
      if Trim( NameEdit.Text ) = '' then
      begin
        MessageDlg('ÇëÊäÈëÓû§Ãû£¡',mtError,[mbOK],0);
        NameEdit.SetFocus;
        Exit;
      end;  if Trim( PwdEdit.Text ) = '' then
      begin
        MessageDlg('ÇëÊäÈëÃÜÂ룡',mtError,[mbOK],0);
        Exit;
      end;  pwd := md5s( PwdEdit.Text );  ADOQuery1 := TADOQuery.Create(self);  ADOQuery1.ConnectionString := ADOCStr;  ADOQuery1.SQL.Clear;
      ADOQuery1.SQL.Add( 'select ' + IFN + ',' + UFN + ',' + PFN + ' From ' +
                         TableName + ' Where ' + UFN + '=' +
                         chr(39) + trim(NameEdit.Text) + chr(39) + ' and '
                         + Term);
      ADOQuery1.Open;  if ADOQuery1.IsEmpty then
      begin
        MessageDlg('ÎÞ´ËÓû§Ãû£¬Çë¼ì²éÊäÈ룡',mtError,[mbOK],0);
        Exit;
      end
      else
      begin
        ADOQuery1.First;    repeat
          if pwd = ADOQuery1.FieldByName( PFN ).AsString then
          begin
            IntPoint^ := 1;
            Break;
          end;
          ADOQuery1.Next;
        until ADOQuery1.Eof;    ADOQuery1.Close;    if IntPoint^ = 1 then
          close
        else
          MessageDlg('ÃÜÂë´íÎó',mtError,[mbOK],0);
      end;
    end;
      

  3.   

    在 主程序 和 dll 都 uses sharemem;
    而且要在第一个位置
      

  4.   

    sharemem是宝兰的内存管理单元,因为你传的参数中含有string类型,它是Delphi中内存分配比较特殊的类型,所以在单元引用的时候必须加上sharemem单元,而且要放在第一的位置。你看一下动态库接口声明单元上的那一段英文就知道了,上面说得很清楚。