bpl 使用之我见 作者:陈晓兵 lead001@126.com, lead@people.com.cn

 bpl 使用之我见

作者:陈晓兵 lead001@126.com, lead@people.com.cn

写在前面
  在此不再赘述bpl与dll的比较,只介绍bpl的动态调用。如需转载敬请保留原版作者信息,
  及实现部分的完整性,
开始---------------------------------------->
        实现过程
           <第一部分 接口单元>
                创建一个接口单元
                {$WEAKPACKAGEUNIT}
                unit uInterface;

                interface
                uses
                  Classes, Forms;
                type
                  TBaseClss = class(TComponent)
                    function CreateForm:TForm; virtual; stdcall;abstract;
                    ...
                  end;

                implementation

                { TBaseClss }


                end.


            <第二部分 调用的主程序>
                选项设置
                Project -> Options -> Packages : Runtime Packages
                        将Build with Runtime Packages复选框选中;

                引用uInterface单元

                调用过程
                function LoadPacket(Fbpl, FClass: String): Boolean;
                var
                  FForm  : TForm;
                  FPersistentClass: TPersistentClass;
                  FBaseClss : TBaseClss;
                  H: HMODULE;
                begin
                  try
                    try
                      H := 0;
                      H := LoadPackage(Fbpl);
                      FPersistentClass := FindClass(FClass);
                      if FPersistentClass <> nil then
                      begin
                        FBaseClss :=
                        TBaseClss(TComponentClass(FPersistentClass).Create(Application));
                        FForm := nil;
                        FForm := FBaseClss.CreateForm;
                        FBaseClss.Free;
                        FBaseClss := nil;
                        FPersistentClass := nil;
                        if Assigned(FForm) then
                        begin
                          FForm.ShowModal;
                          FreeAndNil(FForm);
                        end;
                      end;
                    except
                      Application.MessageBox('此功能未安装', '提示', MB_OK +
                        MB_ICONINFORMATION);
                    end;
                  finally
                    if H <> 0 then
                    begin
                      UnloadPackage(H);
                      H := 0;
                    end;
                  end;
                end;

            <第三部分 创建bpl包>
                创建包

                引用uInterface单元

                创建接口类,实现TBaseClss
                  TTestClass = class(TBaseClss)
                    function CreateForm:TForm; override;
                    ...
                  end;

                function TTestClass.CreateForm: TForm;
                var
                  Form2: TForm2;
                begin
                  Form2 := TForm2.Create(Application);
                  if Assigned(Form2) then
                    Result := Form2
                  else
                    Result := nil;
                end;


                注册类
                initialization
                  RegisterClass(TTestClass);
                  UnRegisterClass(TBaseClss);
                反注册类
                finalization
                  UnRegisterClass(TTestClass);
----------------------------------------结束>

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值