DLL里的函数是 function showmodal(Ahandle:Thandle;Acaption:string;Datas:TDataSource):BOOL; var searchfrm:Tsearchfrm; I:integer; begin application.Handle:=Ahandle; searchfrm :=Tsearchfrm.Create(application); try searchfrm.Caption:=Acaption; searchfrm.DBGrid1.DataSource:=Datas; searchfrm.findfield.Clear; searchfrm.StrL:=Tstringlist.create; for i:=0 to searchfrm.DBGrid1.DataSource.DataSet.FieldCount-1 do begin searchfrm.findfield.Items.Add(searchfrm.dbgrid1.DataSource.DataSet.Fields[i].DisplayName); searchfrm.StrL.Add(searchfrm.dbgrid1.DataSource.DataSet.fields[i].fieldname); end; Searchfrm.findfield.ItemIndex:=0; Searchfrm.findvalue.Text:=''; searchfrm.ShowModal; result:=False; finally searchfrm.Strl.free; searchfrm.findfield.Clear; searchfrm.DBGrid1.DataSource:=nil; searchfrm.Free; end; end; form 里是这样调用的procedure TForm1.Button1Click(Sender: TObject); var libHandle:Thandle; showmodal:Tshowmodal; begin application.Title:='DLL测试'; libHandle:=Loadlibrary('psearch.dll'); try if libHandle=0 then raise EDLLLoadError.Create('无法成功转载DLL'); @showmodal:=Getprocaddress(libHandle,'showmodal'); if not (@showmodal=nil) then showmodal(application.handle,'DLL测试',datasource1) else raiselastwin32error; finally // showmodal(application.handle,'DLL测试',nil); freelibrary(libhandle); end; end;
fm.showmodal;
........
finally
fm.free;
end;
靠
你的参数或返回值里使用了String,或者参数或返回值的类里使用了string属性。你都会出现这个问题,解决的办法是在DLL和应用工程的第一个引用单元加上ShareMem就可以了,这是你的程序就依赖于BorlandMM.DLL,记者一起分发哦!
function showmodal(Ahandle:Thandle;Acaption:string;Datas:TDataSource):BOOL;
var searchfrm:Tsearchfrm; I:integer;
begin
application.Handle:=Ahandle;
searchfrm :=Tsearchfrm.Create(application);
try
searchfrm.Caption:=Acaption;
searchfrm.DBGrid1.DataSource:=Datas;
searchfrm.findfield.Clear;
searchfrm.StrL:=Tstringlist.create;
for i:=0 to searchfrm.DBGrid1.DataSource.DataSet.FieldCount-1 do
begin
searchfrm.findfield.Items.Add(searchfrm.dbgrid1.DataSource.DataSet.Fields[i].DisplayName);
searchfrm.StrL.Add(searchfrm.dbgrid1.DataSource.DataSet.fields[i].fieldname);
end;
Searchfrm.findfield.ItemIndex:=0;
Searchfrm.findvalue.Text:='';
searchfrm.ShowModal;
result:=False;
finally
searchfrm.Strl.free;
searchfrm.findfield.Clear;
searchfrm.DBGrid1.DataSource:=nil;
searchfrm.Free;
end;
end;
form 里是这样调用的procedure TForm1.Button1Click(Sender: TObject);
var libHandle:Thandle;
showmodal:Tshowmodal;
begin
application.Title:='DLL测试';
libHandle:=Loadlibrary('psearch.dll');
try
if libHandle=0 then
raise EDLLLoadError.Create('无法成功转载DLL');
@showmodal:=Getprocaddress(libHandle,'showmodal');
if not (@showmodal=nil) then
showmodal(application.handle,'DLL测试',datasource1)
else
raiselastwin32error;
finally
// showmodal(application.handle,'DLL测试',nil);
freelibrary(libhandle);
end;
end;