有一个程序结构是这样的,数据模块在一个publib.bpl包里,另外有一个窗体的类在formlib.bpl
包里,publib.bpl已经包含在主程序的RUNTIME PACKAGE中了当主程序运行时,在CREATE事件里有下列代码:
pubdata:=TPubdata.Create(self);//创建publib.bpl中数据模块的实例.
With pubdata.mssql do//mssql是数据模块中的一个database控件
begin
Params.Clear;
Params.Add('user name=sa');
Params.Add('password=1990611');
try
Open;
Except
ShowMessage(错误!');
halt;
end;
end;
//下面的是四个BUTTON控件,设置它们的TAG属性为自定义的各种消息常量.
qrydjbtn.Tag:=BS_qrydj;
qrybtn.Tag:=BS_qry;
inbtn.Tag:=BS_IN;
delbtn.Tag:=BS_DEL;然后在其中一个BUTTON控件的ONCLICK事件中有下列代码:
procedure TMainFrm.inbtnClick(Sender: TObject);
// BtnClick(Sender);
type
TExecBpl=function(AOwner:TComponent;MsgID:integer):boolean;
var
h:THandle;
ExecBpl:TExecBpl;
MsgID:integer;
begin
if ((Sender as TButton).Tag<>0) then
begin
MsgID:=(Sender as TButton).Tag;
h:=LoadPackage('Formlib.bpl');
if h<>0 then
begin
try
@ExecBpl:=GetProcAddress(h,'ExecBpl');
if @ExecBPL<>nil then
begin
ExecBPL(Self,MsgID);
end;
finally
FreeLibrary(h);
end;
end
else
ShowMessage('ÎÞ·¨×°½ØFormLib.bplÎļþ,Çë¼ì²é¸ÃÎļþÊÇ·ñ´æÔÚ!');
end;
end;
上面的代码是执行了FORMLIB.BPL中输出的一个PROCEDURE
该PROCEDURE代码如下
procedure ExecBpl;
begin
Case MsgID of //根据消息常量的值来创建不同的窗体实例
BS_DEL:dodel(AOwner);
BS_IN:dofcxsp(AOwner);
BS_qrydj:doqrydj(AOwner);
BS_qry:doqryfrm(AOwner);
end;
end;
但是问题就出现在这,如果创建的窗体中没有数据库控件就一切正常,一旦有数据库控件
如DATASOURCE,DBGRID等,主窗体退出时就显示错误信息
Access violation at address 406ef24a in module 'bdertl60.bpl',read of address 406839be
出现这种错误的原因是什么?我的分不多,还请各位大侠指教,谢谢!
另外:FromLib.bpl的REQUIRES里包含有PUBLIB.BPL包,而且两个包都已经编译为runtime only
包里,publib.bpl已经包含在主程序的RUNTIME PACKAGE中了当主程序运行时,在CREATE事件里有下列代码:
pubdata:=TPubdata.Create(self);//创建publib.bpl中数据模块的实例.
With pubdata.mssql do//mssql是数据模块中的一个database控件
begin
Params.Clear;
Params.Add('user name=sa');
Params.Add('password=1990611');
try
Open;
Except
ShowMessage(错误!');
halt;
end;
end;
//下面的是四个BUTTON控件,设置它们的TAG属性为自定义的各种消息常量.
qrydjbtn.Tag:=BS_qrydj;
qrybtn.Tag:=BS_qry;
inbtn.Tag:=BS_IN;
delbtn.Tag:=BS_DEL;然后在其中一个BUTTON控件的ONCLICK事件中有下列代码:
procedure TMainFrm.inbtnClick(Sender: TObject);
// BtnClick(Sender);
type
TExecBpl=function(AOwner:TComponent;MsgID:integer):boolean;
var
h:THandle;
ExecBpl:TExecBpl;
MsgID:integer;
begin
if ((Sender as TButton).Tag<>0) then
begin
MsgID:=(Sender as TButton).Tag;
h:=LoadPackage('Formlib.bpl');
if h<>0 then
begin
try
@ExecBpl:=GetProcAddress(h,'ExecBpl');
if @ExecBPL<>nil then
begin
ExecBPL(Self,MsgID);
end;
finally
FreeLibrary(h);
end;
end
else
ShowMessage('ÎÞ·¨×°½ØFormLib.bplÎļþ,Çë¼ì²é¸ÃÎļþÊÇ·ñ´æÔÚ!');
end;
end;
上面的代码是执行了FORMLIB.BPL中输出的一个PROCEDURE
该PROCEDURE代码如下
procedure ExecBpl;
begin
Case MsgID of //根据消息常量的值来创建不同的窗体实例
BS_DEL:dodel(AOwner);
BS_IN:dofcxsp(AOwner);
BS_qrydj:doqrydj(AOwner);
BS_qry:doqryfrm(AOwner);
end;
end;
但是问题就出现在这,如果创建的窗体中没有数据库控件就一切正常,一旦有数据库控件
如DATASOURCE,DBGRID等,主窗体退出时就显示错误信息
Access violation at address 406ef24a in module 'bdertl60.bpl',read of address 406839be
出现这种错误的原因是什么?我的分不多,还请各位大侠指教,谢谢!
另外:FromLib.bpl的REQUIRES里包含有PUBLIB.BPL包,而且两个包都已经编译为runtime only
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货