U_Client; 主程序exe的主窗体单元;
U_Main; 包A的主窗体,也是包接口实现单元 (initialization finalization 中注册和释放都已经写过);
U_Main; 包B的主窗体,也是包接口实现单元(initialization finalization 中注册和释放都已经写过);在 U_Client 中第一次调用包A或者包B都能正常显示,但是
例如:先调用A ,再调用B就报错了,(调用B之前已经释放了A)
但是:先调用A,在释放A,再调用A正常,
请大家帮我分析下什么原因!部分代码
1)调用包
strBplName := SystemParam.SysName + '.bpl'; // 动态决定调用那里包,SystemParam.SysName = A|B
BplHWND := LoadPackage(strBplName);
aBplClass := Classes.GetClass('TF_Main'); // 每个包中都有这个类,现在A和B类名一致,我已经试了将名称修改不一样,还是出现同样的问题! If aBPLClass <> nil then
MyBplIntf := TComponentClass(aBPLClass).Create(Application) as IBplIntf;
2)释放包
if Assigned(MyBplIntf) then //释放BPL接口
MyBplIntf := nil;
UnloadPackage(BplHWND);
U_Main; 包A的主窗体,也是包接口实现单元 (initialization finalization 中注册和释放都已经写过);
U_Main; 包B的主窗体,也是包接口实现单元(initialization finalization 中注册和释放都已经写过);在 U_Client 中第一次调用包A或者包B都能正常显示,但是
例如:先调用A ,再调用B就报错了,(调用B之前已经释放了A)
但是:先调用A,在释放A,再调用A正常,
请大家帮我分析下什么原因!部分代码
1)调用包
strBplName := SystemParam.SysName + '.bpl'; // 动态决定调用那里包,SystemParam.SysName = A|B
BplHWND := LoadPackage(strBplName);
aBplClass := Classes.GetClass('TF_Main'); // 每个包中都有这个类,现在A和B类名一致,我已经试了将名称修改不一样,还是出现同样的问题! If aBPLClass <> nil then
MyBplIntf := TComponentClass(aBPLClass).Create(Application) as IBplIntf;
2)释放包
if Assigned(MyBplIntf) then //释放BPL接口
MyBplIntf := nil;
UnloadPackage(BplHWND);
好像不能用只需要free就可以了吧
这句报错,错误: Access Violation at address 00000000, Read of address 00000000;谢谢,1楼的回答,
MyBplIntf : IBplIntf; //BPL包接口定义不能使用free