有一个程序结构是这样的,数据模块在一个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('&Icirc;&THORN;·¨×°&frac12;&Oslash;FormLib.bpl&Icirc;&Auml;&frac14;&thorn;,&Ccedil;&euml;&frac14;ì&sup2;é&cedil;&Atilde;&Icirc;&Auml;&frac14;&thorn;&Ecirc;&Ccedil;·&ntilde;&acute;&aelig;&Ocirc;&Uacute;!');
  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