var
TBSQ_TestT=function:TUser;stdcall;
/////////////////////////////////////////
procedure TForm1.Button2Click(Sender: TObject);
var
FHandle : THandle;
FBSQ_CheckLogin : TBSQ_TestT;
users:Tuser;
begin FHandle := LoadLibrary('BSQ.dll');
if FHandle <> 0 then
begin
@FBSQ_CheckLogin := GetProcAddress(FHandle, 'BSQ_TestT');
if @FBSQ_CheckLogin <> nil then
begin
users:=FBSQ_CheckLogin;
Memo1.Lines.Add(users.username);
end
else
showmessage('加载函数失败');
end
else
showmessage('加载dll失败');
FreeLibrary(FHandle);
end;
=================================================
经过测试 把 FreeLibrary(FHandle); 注释掉就可以正常
初步估计应该是在释放 dll 的时候导致释放资源出错。
但百思不得其解。我在dll中定义的 TestT函数没有啥资源需要释放啊
难道要释放掉 定义的 user:Tuser?????
下面附上 dll中TestT 的定义
function BSQ_TestT:TUser;stdcall;
var
user:TUser;
begin
user.Uid:=1;
user.username:='十七郎';
user.gender:='男';
result:=user;
end;
TBSQ_TestT=function:TUser;stdcall;
/////////////////////////////////////////
procedure TForm1.Button2Click(Sender: TObject);
var
FHandle : THandle;
FBSQ_CheckLogin : TBSQ_TestT;
users:Tuser;
begin FHandle := LoadLibrary('BSQ.dll');
if FHandle <> 0 then
begin
@FBSQ_CheckLogin := GetProcAddress(FHandle, 'BSQ_TestT');
if @FBSQ_CheckLogin <> nil then
begin
users:=FBSQ_CheckLogin;
Memo1.Lines.Add(users.username);
end
else
showmessage('加载函数失败');
end
else
showmessage('加载dll失败');
FreeLibrary(FHandle);
end;
=================================================
经过测试 把 FreeLibrary(FHandle); 注释掉就可以正常
初步估计应该是在释放 dll 的时候导致释放资源出错。
但百思不得其解。我在dll中定义的 TestT函数没有啥资源需要释放啊
难道要释放掉 定义的 user:Tuser?????
下面附上 dll中TestT 的定义
function BSQ_TestT:TUser;stdcall;
var
user:TUser;
begin
user.Uid:=1;
user.username:='十七郎';
user.gender:='男';
result:=user;
end;
解决方案 »
- 很少来D版,昨天来逛了逛,发现一个严重的问题
- 走一走,看一看,各位大哥,小弟有重要问题请教,请各位大哥帮忙
- ly_liuyang来看看.
- 今天早上才发现的问题,不知道大家有没有遇到过。
- 如何在三层体系下建立数据库连接(用代码)
- 问个关于用adoquery查询MSSQL数据表的问题??
- 数据库小问题。
- ADO怎样才能存取oracle的lob字段,我用的是微软的provider 高手请进!
- 主窗体释放Dll窗体??
- 我今天花了1820大元买了K7s5A和AMD XP1600+代替我三年一直用的K62 300,速度真是爽极了,特来送分,只是奥美加的风shan声音太大了。象到了我老家的磨面机房里。(4500转)
- 单元引用问题
- 指定进程添加控件
type
TUser=record
Uid:integer;
username:string[100];
face:string[100];
gender:string[100];
end;
PTUser=^TUser; function BSQ_TestT:PTUser;stdcall;implementationfunction BSQ_TestT:PTUser;stdcall;
var
user:PTUser;
begin
new(user);
user^.Uid:=1;
user^.username:='十七郎';
user^.gender:='男';
result:=user;
dispose(user);
end;调用 users:=BSQ_TestT;
Memo1.Lines.Add(users^.username);解释:dll的参数传递最好用指针
字符串最好用pchar或者shortstring
aUser:Tuser; function SetParams(aParams:Tuser):Boolean; export; stdcall;
function Execute(AHandle:HWnd):Boolean; export; stdcall;......
function SetParams(aParams:Tuser):Boolean;
begin
aUser:=aParams;
end; function Execute(AHandle:HWnd):Boolean;
begin
user.Uid:=1;
user.username:='十七郎';
user.gender:='男';
end;
exe中执行两次调用,第一次调用SetParams,第二次调用Execute
aUser:Tuser; function SetParams(aParams:Tuser):Boolean; export; stdcall;
function Execute(AHandle:HWnd):Boolean; export; stdcall; ......
function SetParams(aParams:Tuser):Boolean;
begin
aUser:=aParams;
end; function Execute(AHandle:HWnd):Boolean;
begin
auser.Uid:=1;
auser.username:='十七郎';
auser.gender:='男';
end;
exe中执行两次调用,第一次调用SetParams,第二次调用Execute
你的方法可行。但有点问题
在dll中
function BSQ_TestT:PTUser;stdcall;
var
user:PTUser;
begin
new(user);
user^.Uid:=1;
user^.username:='十七郎';
user^.gender:='男';
result:=user;
dispose(user);
end;
=======================================
dispose(user); //把这句注释掉就能返回数据。
但不注销 又不能释放new以后的user
是个麻烦事情
你的方法可行。但有点问题
在dll中
function BSQ_TestT:PTUser;stdcall;
var
user:PTUser;
begin
new(user);
user^.Uid:=1;
user^.username:='十七郎';
user^.gender:='男';
result:=user;
dispose(user);
end;
=======================================
dispose(user); //把这句注释掉就能返回数据。
但不注销 又不能释放new以后的user
是个麻烦事情
即下面两句都在主调程序exe里头,不在DLL中。
new(user);
dispose(user);
new(user) 只有在dll中才有效。在主调函数中是无效的
估计是你套用原来的动态调用吧,有时候自己多试试TBSQ_TestT=function:PTUser;stdcall;
procedure TForm1.Button1Click(Sender: TObject);
var
users:PTUser;
FHandle:THandle;
FBSQ_CheckLogin:TBSQ_TestT;
begin
FHandle := LoadLibrary('BSQ.dll');
if FHandle <> 0 then
begin
@FBSQ_CheckLogin := GetProcAddress(FHandle, 'BSQ_TestT');
if @FBSQ_CheckLogin <> nil then
begin
users:=FBSQ_CheckLogin;
Memo1.Lines.Add(users^.username);
end
else
showmessage('加载函数失败');
end
else
showmessage('加载dll失败');
FreeLibrary(FHandle);
end;