dll高手指路(200分)

  • 主题发起人 主题发起人 hewhl
  • 开始时间 开始时间
H

hewhl

Unregistered / Unconfirmed
GUEST, unregistred user!
在dll的frmlgn中有Adoconnection,在host中用dll中的frmfgn传递的是application.handle,可是把frmlgn关闭时老是报地址错,我在关闭前以把adoconnection.Connected:=false,
frmlgn上还有两个动态创的adoquery也closed了!请问这怎么处理!

CODE:
function Tfrmlgn.login(name,psw:string):boolean;
var
qlgn:tadoquery;
begin
try
qlgn:=tadoquery.Create(nil);
qlgn.Connection:=adocn;
qlgn.Active:=false;
qlgn.SQL.Clear ;
qlgn.sql.Text:='select username,password from usertbl where username=:name and password=:psw ';
qlgn.Parameters.ParamValues['name']:=name;
qlgn.Parameters.ParamValues['psw']:=psw;
qlgn.Active:=true;
if qlgn.RecordCount >0 then
result:=false
else
result:=true;
finally
qlgn.Close;[8D]
end;
end;


procedure Tfrmlgn.BitBtn1Click(Sender: TObject);
begin
try
if login(user.Text,psw.Text) then
begin
messagebox(application.handle,'密码不正确!','警告',mb_Iconinformation);
psw.Text:='';
psw.SetFocus;
end
else begin
adocn.Connected:=false;
adocn.Free

frmlgn.close ;
frmsplash:=tfrmsplash.Create(nil);
frmsplash.ShowModal;
frmsplash.Update ;
end;
finally

end;
end;

procedure Tfrmlgn.FormCreate(Sender: TObject);
var
tlgn:tadoquery;
begin
user.text:='';
psw.text:='';
tlgn:=tadoquery.Create(nil);
tlgn.Connection:=adocn;
tlgn.Active :=false;
tlgn.SQL.Text :='select username from usertbl';
tlgn.Active :=true;
while not tlgn.Eof do
begin
user.Items.add(tlgn.FieldValues['username']);
tlgn.Next;
end

user.ItemIndex :=0;
tlgn.close;
end;

请指出错在哪里??????
 
function Tfrmlgn.login(name,psw:string):boolean;
var
qlgn:tadoquery;
begin
try
qlgn:=tadoquery.Create(nil);
qlgn.Connection:=adocn;
qlgn.Active:=false;
qlgn.Close
// 改了这个地方,你再试试看呀!
qlgn.SQL.Clear ;
qlgn.sql.Text:='select username,password from usertbl where username=:name and password=:psw ';
qlgn.Parameters.ParamValues['name']:=name;
qlgn.Parameters.ParamValues['psw']:=psw;
qlgn.Active:=true;
if qlgn.RecordCount >0 then
result:=false
else
result:=true;
finally
//qlgn.Close;[8D]
end;
end;
 
不知道你是如何处理dll中frmlgn的创建和释放的?
一般情况下在DLL在输出创建和释放frmLgn的两个函数.
 
改了这个地方,你再试试看呀!
还是不好用的
高手不在吗?
 
我也遇到过类似的问题,后来将DataModuleDestory中的代码删掉就好了
 
关键我没有DataModule的啊,只用了一个adoconnection还有两个adoquery 是动态创造的[?]
 
动态创的adoquery你是不是在窗体关闭前Free了?
是不是在frmlgn关闭后还使用了frmlgn里面的变量了?
 
楼上:
动态创建的应该由你自己来释放.
只要还没有设置frmlgn 为 nil, 就可以对frmlgn进行使用,前提是frmlgn里的相应变量还没被释放掉.
 
补充:
动态创建的不一定要由自己释放(虽然通常情况下是这么做的)
如果在创建里指定了一个OWNER,则OWNER在释放前会把它们释放.
 
在formcreate中和login中均动态创建taoquery没有释放,要不你就每次都释放,
两次create中均是以qlgn,且没有释放,可能造成不可预料的错误.
qlgn:=tadoquery.Create(nil)
//-->无owner,无法自动释放
finally
qlgn.Close;
后加
qlgn.free;

要不就直接在form上放一个adoquery,你就不需要每次都动态创建,释放了.
例外你的程序有漏洞,密码用 [blue]1' and '1'='1[/blue] 试试
 
后退
顶部