posts - 16,  comments - 17,  trackbacks - 0

  问题来源如下:有一个EXE和两个DLL,用到同一个公共单元:

unit UnitBpl;

interface
uses Classes;
type
TBaseClass= class of TBase;

TBase=class(TPersistent)
public
procedure show;virtual;
end;

implementation

{ TBase }

procedure TBase.show;
begin

end;

end.

在DLL_1中:

Type

TMy1=class(TBase)
public
procedure Show;override;
end;

implementation


procedure TMy1.Show;
begin
inherited;
ShowMessage('我是TMy1');
end;

initialization
RegisterClass(TMy1);
finalization
UnregisterClass(TMy1);

DLL_2中:

Type

TMy2=class(TBase)
public
procedure Show;override;
end;

implementation


procedure TMy2.Show;
begin
inherited;
ShowMessage('我是TMy2222');
end;

initialization
RegisterClass(TMy2);
finalization
UnregisterClass(TMy2);

EXE中:

procedure TFrmMain.btn1Click(Sender: TObject);
var
myObj:TBase;
BaseClass:TBaseClass;
begin
BaseClass:=TBaseClass(FindClass('TMy2'));//TBaseClass(FindClass('TMy1'));
myObj:=BaseClass.Create;
myObj.show;

end;

  目的很明显了,就是想从dll_1和dll_2 中导出相同父类的不同子类,但是在loadLibary的时候,会提示如下图:

提示名为TBase的类已经存在!!!为什么呢?  

RegisterClass(TMy2);
RegisterClass(TMy1); 
  没有注册TBase类啊?

如果注释掉其中一句RegisterClass,则哥运行,当然,

BaseClass:=TBaseClass(FindClass('TMy2'))
这一句就会出错了

因为其中有一个类未注册

 

期待高手为人解惑。。



posted on 2012-02-25 19:05 Bach 阅读(...) 评论(...) 编辑 收藏