研究心得------->Delphi(C++Builder)包(Package)动态加载和动态注册类技术的深入探索 (0分)

  • 主题发起人 主题发起人 wr960204
  • 开始时间 开始时间
我的意思说我用你的程序打开我做的BPL包,打开是可以取道单元名字之类,但是不能在Panel
里面显示我BPL里面的窗体之类的东西,能不能再解析一下呢,我现在有点模糊:(
 
也就是能不能告诉我在创建BPL的时候要特别做些什么步骤才可以,我看到你的DEMO。BPL有
400多K,我的才10多K,是不是我没有把VCL,RTL包加进去了。
 
和BPL的大小无关。你的控件类注册了么?
 
我想应该是我做BPL的时候有问题,能不能说说怎样做BPL呢,谢谢!
 
控件在initialization部分注册了
 
包不是在initialization部分注册的.那样的话IDE不会把你的组件放到面板上的.
你要有一个Register过程来注册组件才行.
 
我的代码,很简单的:
unit aa;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TMytest = class(TForm)
RadioButton1: TRadioButton;
CheckBox1: TCheckBox;
GroupBox1: TGroupBox;
Panel1: TPanel;
Edit1: TEdit;
private
{ Private declarations }
public
procedure register;
{ Public declarations }
end;

var
Mytest: TMytest;

implementation

{$R *.dfm}
{ TMytest }

{ TMytest }

procedure TMytest.register;
begin
RegisterClass(Tmytest);
end;
end.
我把这个Form做成BPL。
然后用这段代码来调用:
procedure TForm1.Button1Click(Sender: TObject);
var
PackageModule: HModule;
regproc: procedure();
AClass: TPersistentClass;
begin
PackageModule := LoadPackage('d:/temp/bpltest/Package1.bpl');
if PackageModule <> 0 then
begin
RegProc:= GetProcAddress(PackageModule,Pchar('@Aa@Register$qqrv'));//载入包中的函数
if Assigned(RegProc) then
begin
regproc();//调用函数
end;

AClass := GetClass('TMytest');

if AClass <> nil then
with TComponentClass(AClass).Create(Application)
as TCustomForm do
begin
ShowModal;
Free;
end;
end;
UnloadPackage(PackageModule);

end;

但就是不行。
 
需要我另外开帖子吗?
 
我也來研究一下
 
改成
unit aa;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TMytest = class(TForm)
RadioButton1: TRadioButton;
CheckBox1: TCheckBox;
GroupBox1: TGroupBox;
Panel1: TPanel;
Edit1: TEdit;
private
{ Private declarations }
public
{ Public declarations }
end;
procedure register;
var
Mytest: TMytest;

implementation

{$R *.dfm}
{ TMytest }

{ TMytest }

procedure register;
begin
RegisterClass(Tmytest);
end;
end.
 
中看不中用的东西,
凑热闹的人还挺多!
[:D][:D]
 
wr960204,指正得好,不应该放在类里面,但是现在还没有效果,我看应该是我做BPL的步骤
有错误,我是这样做的,在Delphi那里选择新建包,然后Add那里把aa.pas加进去,然后Add
vcl.dcp,然后编译出BPL文件。我这个步骤是不是错了。
 
xianghb,什么没有用啊,这种方法可灵活。
 
我上面写错了你的
RegisterClass(Tmytest);
改成
RegisterComponents('TMyTest',[Tmytest]);
 
问题是这一句,
RegProc:= GetProcAddress(PackageModule,Pchar('@Aa@Register$qqrv'));//载入包中的函数
拿不出过程来,RegProc = Inaccessible Value
 
我不是说过,你的调用包的程序要带VCL.BPL包运行的
 
对对,我开始对带包编译不明白,先在明白了,谢谢,
一开始我的做法也可以,就是最后漏了带包编译这个步,上面的两种写法都可以,非常感谢。
 
wr960204兄,现在我只有最后一个疑问,就是带包编译时候,编译器究竟做了些什么呢。
 
不带VCL.BPL包的话Classes在Exe中有一份,而BPL用也有一份。但是带VCL.BPL后,EXE和BPL就共享一个Classes包。
Delphi的IDE也是这样实现的
 
后退
顶部