关于动态加载bpl的问题——如何获得bpl中的窗体类?
我现在在看以前的一个老程序,除了主界面外,全部都是动态加载包,调用里面的窗体。
主程序中菜单项对应的窗体类,是从数据库表中得到的,当我点击菜单时,首先判断这个窗体类是不是已经存在,如果不存在,则加载这个窗体类对应的包(包和窗体类的对应关系也是存储在数据库表中),然后在获得这个窗体类,在显示这个窗体。
菜单对应窗体类,没办法,只能手工加入到数据库表中。
包和窗体类的对应,是通过一个exe文件执行的,而这个exe文件,则没有源代码。但执行效果可以看得到。当选择了一个bpl文件后,列表框中显示这个包中有哪些窗体类。
我现在就比较困惑,这个功能是怎么实现的。
因为我查找了很多资料,说如果要超找包中的类,必须首先要对类进行注册,执行诸如下面的代码:
initialization
RegisterClass(TForm2);
finalization
UnRegisterClass(TForm2);
才能用FindClass或者GetClass根据类名得到相应的类。
procedure TForm1.Button1Click(Sender: TObject);
var
PackageModule : HModule;
AClass : TPersistentClass;
begin
PackageModule := LoadPackage('Package1.bpl');
if PackageModule <> 0 then
begin
//AClass := GetClass('TForm2');
AClass := FindClass('TForm2');
if AClass <> nil then
with TComponentClass(AClass).Create(Application) as TCustomForm do
begin
ShowModal;
Free;
end;
UnLoadPackage(PackageModule);
end;
end;
以上代码测试过,如果注释掉Form2中的那4行代码,以上代码根本无法找到TForm2。
而以前老程序留下的包中的窗体的源代码,根本就没有关于注册的那部分代码,
那他是如何得到bpl中的窗体类呢?