动态载入BPL包的完整过程及其他

本文详细介绍了在Delphi中动态加载BPL包的步骤及注意事项,包括解决常见错误的方法、BPL包的正确构建方式、如何加载表单与数据模块等关键技术点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.出现'A CLASS NAMED Already exists' 错误

如果你是动态载入BPL包,那有一原因是在呼叫BPL的程序已经USES了那个包中的类或模块;删除USES中的名字

2.出现'无法注册窗体'
在呼叫程式的component/install packages的build with runtime packages里面,把基类包含进去,在动态载入BPL中表单的时候,常常会出现这个问题;

3.整个动态载入bpl包的过程:
预备动作:
1).在呼叫程式的component/install packages的build with runtime packages里面,把基类包含进去
2)在呼叫程式的uses中把当前程式中的类或模块包含进去,并且决不能包含动态载入的BPL包中的任何东西;
3)编写bpl包时,要把基类的.dcp文件包含到requires中,并且注意:在呼叫程式和BPL中都应当包含VCL.dcp,否则呼叫程式无法识别BPL包的注册.
4).在bpl包中的form初始化阶段,要将它对应的DATAMODULE建立,方法如下:

uses datamodulename;

procedure tform1.create(sender:tobject);
begin
if  fmdatamodulename=nil then application.createform(tdatamodulename,fmdatamodulename);
inherited;
end;
datamodulename是指数据模块中.pas的名字,fmdatamodulename是指表单的名字,tdatamodulename是它的类名;
5)只要是被外部呼叫的东西,在它pas中都应当注册,如下:

initialization
RegisterClass(Tfmname);
finalization
RegisterClass(Tfmname);

tfmname是指这个表单的类名;
这两个标识放在implementation之后,end.之前任意的非过程内即可;
6)注意编译BPL包存放的位置,编译后有三个档案是有用的:.bpl是打包给别人用的,.dcu是记录性质的文档,.dcp是包含在呼叫程式的运行时程式中的.

载入bpl包:
1)载入bpl包
  var
   moduleinstance:HMODULE;
begin
    ModuleInstance := LoadPackage(FileName);
end;
2)载入数据模块:
function CreateDataModuleByClassName(const ClassName: string): TDataModule;
var dmTemp: TDataModule;
    AClass: TPersistentClass;
begin
  Result := nil;
  AClass := GetClass(ClassName);
  if (AClass <> nil) then
  begin
    dmTemp := TComponentClass(AClass).Create(Application) as TDataModule;
    Result := dmTemp;
  end;
end;

3)载入表单
function CreateFormByClassName(const ClassName: string): TCustomForm;
var
  AClass: TPersistentClass;
begin
  { Note that TApplication "owns" this form and thus it must be freed prior
    to unloading the package }
  AClass := GetClass(ClassName);
  if AClass <> nil then
    Result := TComponentClass(AClass).Create(Application) as TCustomForm
  else
    raise Exception.CreateFmt(sErrorCreateForm, [ClassName]);
end;
4)显示表单
function ShowModalFormByClassName(const ClassName: string;const IsShowModal: shortstring): integer;
var
  frm: TCustomForm;
begin
  Result:=0;
  frm := CreateFormByClassName(ClassName);
  try
    if IsShowModal='Y' then
    Result := frm.ShowModal
    else
    frm.Show;
  finally
    if IsShowModal='Y' then frm.Release;
  end;
end;

卸载包:
  UnRegisterModuleClasses(ModuleInstance);
  UnloadPackage(ModuleInstance);
如果用完了就卸,无所谓,否则就要把它ModuleInstance全局定义一下.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值