动态加载dll动态库时,参数传递时只有第一个参数可以正确传到形参,是哪里设置的不对么?被加载的dll代码 如下:
library minmax;
uses Dialogs,SysUtils;function Max(var X:Integer;var Y:Integer):Integer;
var
sss:string;
begin
sss:=Format('max()参数1=%d,参数2=%d',[x,y]);
ShowMessage(sss);
if X > Y then
begin
ShowMessage('max返回值是X');
Result := X;
end
else
begin
ShowMessage('max返回值是y');
Result:= Y;
end;
end;
function Min(var X:Integer;var Y:Integer):Integer;
var
sss:string;
begin
sss:=Format('min()参数1=%d,参数2=%d',[x,y]);
ShowMessage(sss);
if X < Y then
begin
ShowMessage('min返回值是X');
Min:= X;
end else
begin
ShowMessage('min返回值是y');
Min := Y;
end;
end;exports
Max,
Min,
begin
end.
这个dll静态调用的时候,正常!
可是动态加载的时候,第二个参数y,传递的总是不对啊,解决问题,追加给分!
调用dll的工程代码如下:
unit Unit1;interfaceuses
Windows, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons;type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
BitBtn1: TBitBtn;
Label1: TLabel;
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.BitBtn1Click(Sender: TObject);type
TTimeRec = record
Second: Integer;
Minute: Integer;
Hour: Integer;
end;
TGetmax = function (var a:Integer;var b:Integer):Integer;stdcall;
TGetmin = function (var a:Integer;var b:Integer):Integer;stdcall;
var
//handle:THandle;
handle:Cardinal;
a,b:Integer;
max:TGetmax;
min:TGetmin;
GetTime: TGetTime;
tp:TFarProc;
c,d:Integer;
Time: TTimeRec;
begin
a:=StrToInt(Edit1.Text);
b:=StrToInt(Edit2.Text);
handle:=LoadLibrary('minmax.dll');
if handle<>0 then
begin
@max:=GetProcAddress(handle,'Max');
if (@max <> nil) then
begin
c:=max(a,b);
end;
@min:=GetProcAddress(handle,'Min');
if @min <> nil then
begin
d:=min(a,b);
end;
Edit3.Text:=IntToStr(c);
Edit4.Text:=IntToStr(d);
end;
FreeLibrary(Handle);
end;end.
library minmax;
uses Dialogs,SysUtils;function Max(var X:Integer;var Y:Integer):Integer;
var
sss:string;
begin
sss:=Format('max()参数1=%d,参数2=%d',[x,y]);
ShowMessage(sss);
if X > Y then
begin
ShowMessage('max返回值是X');
Result := X;
end
else
begin
ShowMessage('max返回值是y');
Result:= Y;
end;
end;
function Min(var X:Integer;var Y:Integer):Integer;
var
sss:string;
begin
sss:=Format('min()参数1=%d,参数2=%d',[x,y]);
ShowMessage(sss);
if X < Y then
begin
ShowMessage('min返回值是X');
Min:= X;
end else
begin
ShowMessage('min返回值是y');
Min := Y;
end;
end;exports
Max,
Min,
begin
end.
这个dll静态调用的时候,正常!
可是动态加载的时候,第二个参数y,传递的总是不对啊,解决问题,追加给分!
调用dll的工程代码如下:
unit Unit1;interfaceuses
Windows, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons;type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
BitBtn1: TBitBtn;
Label1: TLabel;
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.BitBtn1Click(Sender: TObject);type
TTimeRec = record
Second: Integer;
Minute: Integer;
Hour: Integer;
end;
TGetmax = function (var a:Integer;var b:Integer):Integer;stdcall;
TGetmin = function (var a:Integer;var b:Integer):Integer;stdcall;
var
//handle:THandle;
handle:Cardinal;
a,b:Integer;
max:TGetmax;
min:TGetmin;
GetTime: TGetTime;
tp:TFarProc;
c,d:Integer;
Time: TTimeRec;
begin
a:=StrToInt(Edit1.Text);
b:=StrToInt(Edit2.Text);
handle:=LoadLibrary('minmax.dll');
if handle<>0 then
begin
@max:=GetProcAddress(handle,'Max');
if (@max <> nil) then
begin
c:=max(a,b);
end;
@min:=GetProcAddress(handle,'Min');
if @min <> nil then
begin
d:=min(a,b);
end;
Edit3.Text:=IntToStr(c);
Edit4.Text:=IntToStr(d);
end;
FreeLibrary(Handle);
end;end.
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货