我想通过调用一个DLL文件来给ComboBox添加一个表中的某一个字段的所有值,总是报错“invalid pointer operation!”,然后死机!!烦请高手指教!程序段如下:DLL程序段:
procedure AddData(PDatabaseName,PTableName,PItemName:Pchar;                  var s:TStrings);  stdcall;var
   sqlStr:string;
   q:TQuery;begin
   sqlStr:='';
   q:=TQuery.Create(nil);
   q.DatabaseName:=PDatabaseName;
   sqlStr:=sqlStr+'select * from '+PTableName;
   q.SQL.Clear;
   q.SQL.Add(sqlStr);
   q.Open;   while not q.Eof do
   begin
      s.add(q.fieldbyname(PItemName).AsString);
      q.Next;
   end;
   q.Close;
   q.Free;
end;
exports
   AddData;
调用DLL:
procedure AddData(PDatabaseName,PTableName,PItemName:Pchar; var                  s:TStrings); stdcall;  external 'AddDataDLL.dll';procedure TForm1.FormCreate(Sender: TObject);var ts:TStrings;
    PDatabaseName,PTableName,PItemName:Pchar;begin
   PDatabaseName:=Pchar(table1.DatabaseName);
   PTableName:=Pchar(table1.TableName);
   PItemName:=Pchar('ex_name');
   ts:=TStringlist.Create;
   try
     AddData(PDatabaseName,PTableName,PItemName,ts);
     ComboBox1.Items.AddStrings(ts);
   finally
     ts.Free;
   end;
end;

解决方案 »

  1.   

    因为q.DatabaseName为string类型所以你最好在dll里加上uses sharemem单元,
    传递变量直接传string类型就可以了。还有输出函数中的var s:TStrings,不要这样用,用指针来传递。
      

  2.   

    var s:TStrings,不要这样用,用指针来传递。这样传不是指针吗?我觉的是指针
      

  3.   

    var s:TStrings,不用指针不行吗?下面的程序就没有问题.
    procedure AddString(var s:TStrings);  stdcall;
    begin
        s.Add('Animals');
        s.Add('Flowers');
        s.Add('Cars');
    end;exports
       AddString;加上uses sharemem也不行呀?有没有其他要改进的?