問題來源如下:有一個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'))
這一句就會出錯了
因為其中有一個類未注冊
期待高手為人解惑。。