Posted on

delphi bpl 共享包冲突

2009-10-08 9:55

delphi中执行loadPackage,出现Cannot load package ‘vcl100.’ It contains unit ‘Forms,’which is alsocontained in package ‘Package2’ 的解决办法

这两天做了一个小程序,实现了动态加载包的功能。
Project MyApp.exe raised exception class EPackageError with message ‘Cannot load package ‘vcl100.’ It contains unit ‘Forms,’which is alsocontainedin package ‘Package2”.
功能代码如下
var
temp :TComponent;
clazz :TPersistentClass;
a :TInterfacedObject;
dlg :IDialog;
s :String;
begin
package1ModelHandle :=LoadPackage(‘lib\package1.bpl’);
clazz :=GetClass(‘TMyFactory1’);
temp :=TComponentClass(clazz).Create(nil);
FMyFactory1:=IMyFactory(temp asIInterface);
dlg :=FMyFactory1.getDialog;
try
s := dlg.getDialogCaption;
ShowMessage(s);
finally
dlg :=nil;
end;//finally

package2ModelHandle :=LoadPackage(‘lib\package2.bpl’);
clazz :=GetClass(‘TMyFactory2’);
temp :=TComponentClass(clazz).Create(nil);
FMyFactory2:=IMyFactory(temp asIInterface);
dlg :=FMyFactory2.getDialog;
try
s := dlg.getDialogCaption;
ShowMessage(s);
finally
dlg :=nil;
end;//finally
end;
当代码执行到斜体字部分时,会出现如下的异常

Cannot load package ‘Package2’ It contains unit ‘uUtility,’ which is alsocontained in package ‘Package1’

网上找了一些文章,总算是找到了答案,原因是这样的。

delphi的包不能出现重复单元,如果package1.bplpackage2.bpl里面都有uUtility.pas,那么当加载了package1.bpl之后再加载package2.bpl时就会出现这个异常.

解决办法也容易,把两个包里面都会用到的单元抽取成一个公共包commonlib.bpl

要点如下:

1.删除package1.dpkpackage2.dpk中的公共单元文件
2.package1.dpk 和 package2.dpkrequirs中要加入commonlib.dcr
3.commonlib.dpk工程的所有公共单元都要加入search path,我是加入了全局的library path
4.commonlib.bpl要放在一个系统可以找到的地方,比如%Windir%\System32目录下,或者是与主执行文件同一目录下。
5.commonlib.bpl必须是一个设计期和运行期的包。

目录结构如下

app\MyApp.exe
app\common.bpl
app\lib\package1.bpl
app\lib\package2.bpl

这样再执行loadPackage方法加载package1.bplpackage2.bpl就不会出错了。

Leave a Reply

Your email address will not be published.