动态加载*.bpl文件,并创建其中的对象,调用后释放,有谁做过?(50分)

  • 主题发起人 LiChaoHui
  • 开始时间
L

LiChaoHui

Unregistered / Unconfirmed
GUEST, unregistred user!
定义几个模块,
在程序运行时,选择性的调入,
并使用其中的对象
使用完毕后进行释放
谁有好的办法?
 
装入包的函数:
var
PackID: HMONITOR
PackagesName: string;
begin
PackagesName := ...//包名
PackID:= LoadPackage(PackagesName);
InitializePackage(PackID);
end;

//创建对象
ClassName := GetClass(注册的类名);
if ClassName <> nil then
begin
GlobalID :=
TDataModule(TComponentClass(DmShare).Create(Application));
for iCounter := 0 to admGlobal.ComponentCount - 1 do
begin
if UpperCase(admGlobal.Components[iCounter].Name) = 'ADODATASETBILL' then
begin
aQuery := TQuery(admGlobal.Components[iCounter]);
aQuery.Active := True;
DataSource1.DataSet := aQuery;
break;
end;
end;
end;
end;
 
在帮助中,Delphi这样说
Note: InitializePackage is called internally by the LoadPackage function.
InitializePackage 函数被 LoadPackage 内部调用了,所以你的
InitializePackage(PackID);就没有必要了

还有,当我使用GetClass的时候总是返回nil

如果我要调用创建的对象的方法,
譬如我定义了一个 TCustomBill的类,通过上面的方法创建的对象
怎么调用他的一个方法 GetBillCount 呢?
 
把包含TCustomBill的类的单元单独做成一个BPL。
主程序例正常引用。
在模块包的BPL中引用前引个BPL,但不要加在Contains中加在Requires中
 
to: wr960204,你的方法,我不明白

这是我的代码
hModule := LoadPackage('dclusr60.mo');
ShowMessage('$'+IntToHex(Integer(hModule), 8));

@GetCs := GetProcAddress(hModule, 'GetClass');
ShowMessage('$'+IntToHex(Integer(@GetCs), 8));

TPersistentClass(m) := GetCs('THZSpell');
ShowMessage('$'+IntToHex(Integer(m), 8));
Obj := m.Create(nil);
ShowMessage(Obj.ClassName);

SetStrProp(Obj, 'HzText', '在那样关灿烂的日子里我们');
ShowMessage(GetStrProp(Obj, 'HzSpell'));

Obj.Free;
UnloadPackage(hModule);
 
多人接受答案了。
 
顶部