我在DLL里面有这样一个函数:返回tstringlist,在这个函数就是读出一个值,然后返回.function TForm1.conSqlName(getWord: string;gettablename:string): Tstringlist;
var
  accstr,temstr: string;
  rstring: TstringList;
  counti,i: integer;begin
   accstr:='';
   accstr :=  'Select KeyName from YY_Sys_TableName where KeyWord='+ ''''+getWord+''''
          + ' and TableName='+''''+gettablename+'''';
    Form1.ADOQuery1.Close;
    Form1.ADOQuery1.SQL.Clear;
  with Form1.ADOQuery1 do
  begin
     SQL.Add(accstr);
     Open;
  end;
  counti := 0;
  counti := ADOQuery1.RecordCount;
  rstring.Free;
  rstring := TStringList.Create();
  i := 1;
  for I := 1 to counti do  begin
     temstr := ADOQuery1.Recordset.Fields.Item[0].Value;
     ADOQuery1.Recordset.MoveNext;
     rstring.Add(temstr);
     counti := counti+1;
  end;
     ADOQuery1.SQL.Clear;
     ADOQuery1.Close;
     Result := rstring;
end;
我用这样的方法调用:procedure TForm2.FormCreate(Sender: TObject);
var
  lw,lt:string;
  i: integer;
  clist: TStringList;
begin
  clist:= TStringList.Create();
  lw := 'AddressCharacter';
  lt := 'YY_fangwu_Character';
  clist := Form1.conSqlName(lw,lt);
  combobox1.Clear;
  i := 0;
  for i := 0 to clist.Count-1 do
  begin
    combobox1.Items.Add(clist[i]) ;
  end;
    combobox1.ItemIndex := 0;
    clist.Free;end;就是在这个combobox里面显示第一个函数里面的值.一切正常,问题是,我紧接着在第二个地方调用的时候,就死活通不过!!!
急呀!!!var
  lw,lt:string;
  i: integer;
  clist1: TStringList;
begin
  clist1:= TStringList.Create();  case ComboBox1.ItemIndex of
  0: //普通主宅
  begin
    lw := 'putongzhuhu';
    lt := 'OwnerTable';
  end;
  1:   //出租户
  begin
    lw := 'zhulinghu';
    lt := 'OwnerTable';
  end;
  2: // 单位
  begin
    lw := 'qishidanwei';
    lt := 'OwnerTable';
  end;
  3:  //宣传栏
  begin
    lw := 'xuanchuanlan';
    lt := 'OwnerTable';
  end;
  else
  begin
      showmessage('othjer');
  end;
end;
  combobox2.Clear;
  clist1 := fconSqlName(lw,lt);
  i := 0;  for i := 0 to clist1.Count-1 do
  begin
  combobox2.Items.Add(clist1[i]) ;
  end;
  combobox1.ItemIndex := 0;
  clist1.Free;
200分相送,如果愿意,请高人教一下delphi里面ado的连接比较高效的方式!

解决方案 »

  1.   

    因为你引用了String类型你必须在DLL与Exe工程的Uses 加ShareMem.
    第一次Uese单元.clist1:= TStringList.Create();//这行是不要的, 要不会出现内存
    泄露.
      

  2.   

    ADOQuery1.Close;
        ADOQuery1.SQL.Clear;
    就是在这儿就卡住了.access violation at address 005A54D3 in module 'yy.dll'
      

  3.   

    ADOQuery1.Close;
        ADOQuery1.SQL.Clear;
    就是在这儿就卡住了.access violation at address 005A54D3 in module 'yy.dll'
      

  4.   

    dll调用里直接用string类型?是不是这的问题?