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;
调用的时候. 下面这样写就没问题.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;
(DM as IAAA).ShowAAAForm('AAA', Self);
的时候,引用数加了1.
DM.Free;引用数并没有减少.
凡是TComponent继承下来的接口,都要注意这个问题,否则很容易关闭时无规律地出现错误。TInterfacedObject继承下来的会省事些。
顶一下吧
接口的释放需要置nil
一直有点烦DELPHI里的接口.
['{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;
使用as操作符必须符合下面条件: 1.接口必须明确地指定是从IInterface接口继承下来。 2.必须拥有GUID值