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);

解决方案 »

  1.   

    是在那一句出错??MyBplIntf := nil; 
    好像不能用只需要free就可以了吧
      

  2.   

     MyBplIntf := TComponentClass(aBPLClass).Create(Application) as IBplIntf; 
    这句报错,错误: Access Violation at address 00000000, Read of address 00000000;谢谢,1楼的回答,
      MyBplIntf : IBplIntf;   //BPL包接口定义不能使用free
      

  3.   

    IBplIntf 这个是什么?,我想MyBplIntf这个应该只是一个指针,指向你创建的对象,所以你在MyBplIntf:=nil后你释放了这个指针,后期再用的时候又没有创建他,要创建的话应该是用IBplIntf来创建所以你在释放包的时候尝试不要对MyBplIntf进行操作 看看