dll文件:uses SysUtils,Graphics, jpeg,ADODB,DB,ExtCtrls, Classes;{$R *.res} procedure ShowImage(image:Timage;dataset:Tdataset;field:string);stdcall; var tpeg:tadoblobstream; tjpe:tjpegimage; begin if tblobfield(dataset.FieldByName(field)).IsNull=false then begin tpeg:=tadoblobstream.Create(tblobfield(dataset.FieldByName(field)),bmread ); tjpe:=Tjpegimage.Create ; tjpe.LoadFromStream(tpeg); image.Picture.Assign(tjpe); tpeg.Free; tjpe.Free ; end; end; exports ShowImage; exe文件:procedure TForm1.SpeedButton1Click(Sender: TObject); type TShowImage=Procedure(Image:Timage;dataset:Tdataset;field:string); var DllInstance:THandle; PFunc:TFarProc; begin DllInstance:=loadlibrary('Exam.dll'); if DllInstance=0 then begin showmessage('can not load dll'); exit; end; pFunc:=GetProcaddress(DllInstance,'ShowImage'); if pFunc<>nil then TShowImage(pFunc)(image1,adotable1,'k38') else showmessage('can not find the function'); freelibrary(DllInstance); end;end.报错,错在哪儿?
type TShowImage=Procedure(Image:Timage;dataset:Tdataset;field:string); 在上面那行最后加上stdcall,变成: type TShowImage=Procedure(Image:Timage;dataset:Tdataset;field:string);stdcall; 就行了。
SysUtils,Graphics,
jpeg,ADODB,DB,ExtCtrls,
Classes;{$R *.res}
procedure ShowImage(image:Timage;dataset:Tdataset;field:string);stdcall;
var tpeg:tadoblobstream;
tjpe:tjpegimage;
begin
if tblobfield(dataset.FieldByName(field)).IsNull=false then
begin
tpeg:=tadoblobstream.Create(tblobfield(dataset.FieldByName(field)),bmread );
tjpe:=Tjpegimage.Create ;
tjpe.LoadFromStream(tpeg);
image.Picture.Assign(tjpe);
tpeg.Free;
tjpe.Free ;
end;
end;
exports
ShowImage;
exe文件:procedure TForm1.SpeedButton1Click(Sender: TObject);
type TShowImage=Procedure(Image:Timage;dataset:Tdataset;field:string);
var DllInstance:THandle;
PFunc:TFarProc;
begin
DllInstance:=loadlibrary('Exam.dll');
if DllInstance=0 then
begin
showmessage('can not load dll');
exit;
end;
pFunc:=GetProcaddress(DllInstance,'ShowImage');
if pFunc<>nil then
TShowImage(pFunc)(image1,adotable1,'k38')
else
showmessage('can not find the function');
freelibrary(DllInstance);
end;end.报错,错在哪儿?
在上面那行最后加上stdcall,变成:
type TShowImage=Procedure(Image:Timage;dataset:Tdataset;field:string);stdcall;
就行了。
PFunc: TFarProc;
改成
PFunc: TShowImage;
我一般都用后面这种声明方式。