我想通过调用一个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;
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;
传递变量直接传string类型就可以了。还有输出函数中的var s:TStrings,不要这样用,用指针来传递。
procedure AddString(var s:TStrings); stdcall;
begin
s.Add('Animals');
s.Add('Flowers');
s.Add('Cars');
end;exports
AddString;加上uses sharemem也不行呀?有没有其他要改进的?