EXE+BPL   BPL中的DM实现了IAAA接口的ShowAAAForm方法.
调用的时候. 下面这样写就没问题.procedure TAAA.Button1Click(Sender: TObject);
var
  hBpl: HMODULE;
  DM: TDataModule;
  IA: IAAA;
begin
  hBpl := LoadPackage('ABC.bpl');
  DM := TDataModule(TComponentClass(FindClass('TABCDM')).Create(Application));
  try
    IA := DM as IAAA;
    IA.ShowAAAForm('AAA', Self);
  finally
    IA := nil;
    DM.Free;
    UnLoadPackage(hBpl);
  end;
end;
换成这样,在退出的时候就报错.procedure TAAA.Button1Click(Sender: TObject);
var
  hBpl: HMODULE;
  DM: TDataModule;
begin
  hBpl := LoadPackage('ABC.bpl');
  DM := TDataModule(TComponentClass(FindClass('TABCDM')).Create(Application));
  try
    (DM as IAAA).ShowAAAForm('AAA', Self);
  finally
    DM.Free;
    UnLoadPackage(hBpl);
  end;
end;

解决方案 »

  1.   

    我觉得是
    (DM as IAAA).ShowAAAForm('AAA', Self);
    的时候,引用数加了1. 
    DM.Free;引用数并没有减少.
      

  2.   

    关键语句就在这里:IA := nil;
    凡是TComponent继承下来的接口,都要注意这个问题,否则很容易关闭时无规律地出现错误。TInterfacedObject继承下来的会省事些。
      

  3.   

    IAAA没用过,不清楚
    顶一下吧
      

  4.   

    很可能
    接口的释放需要置nil
      

  5.   

    UP
    一直有点烦DELPHI里的接口.
      

  6.   

    对了. 忘记加    
     ['{CEF3D561-8FCF-4947-B709-131AC094D546}'] 
     和不加     
    ['{CEF3D561-8FCF-4947-B709-131AC094D546}']的区别了.  有GUID转换就能成功, 没有GUID就转换不了.谁给解释一下.type
      IShowMainForm = interface
        ['{CEF3D561-8FCF-4947-B709-131AC094D546}']
        procedure ShowMainForm(AParam: string); stdcall;
      end;
      

  7.   

    如果要实现具有COM特性的接口的话则需要加上,delphi中对于有GUID的接口在运行时在VMT表的预定位置生成接口的信息,如接口方法的定义、方法参数定义能详细信息。
     使用as操作符必须符合下面条件:  1.接口必须明确地指定是从IInterface接口继承下来。  2.必须拥有GUID值