2011-11-13 219 views
3

我想使用BPL在delphi2010中创建一个模块化应用程序。 问题是当我尝试在BPL内创建类时,出现此错误消息。德尔福:资源未找到错误?

enter image description here

我没有做关于资源(RES文件)进行任何操作!

Procedure TControllerMain.Btn1OnClick(Sender: TObject); 
type 
    TInitProcedure = function: TModuleBaseClass; stdcall; 
    TModuleBaseClass= class of TModuleBase; 
var 
    h: HMODULE; 
    proc: TInitProcedure; 
    vClass: TModuleBaseClass; 
begin 
    h := LoadPackage('test.bpl'); 
    @proc := GetProcAddress(h, 'InitializePlugin'); 
    vClass := proc(); 
    vClass.Create(nil); // error here 
    UnloadPackage(h); 
end; 

DLL的代码

TModuleBase是TCustomPanel

type 
    TVLCVideo = class(TModuleBase) 
    private 
    ... 
    public 
    ... 
    end; 
function InitializePlugin: TModuleBaseClass; stdcall; 


implementation 
function InitializePlugin: TModuleBaseClass; 
begin 
    Result := TVLCVideo; 
end; 


exports 
    InitializePlugin; 

end. 
+2

DFM流时会发生这种类型的错误,但只有当'TModuleBase'从'TForm'推导建立主要应用,'TFrame'或'TDataModule',而不是'TCustomPanel'。 –

+0

Okey,你能告诉我有什么方法可以在dll中使用组件吗?我不想创建ActiveX组件 – relativ

+1

如果'InitializePlugin()'返回一个实例化对象而不是类类型,是否也有同样的问题?调用堆栈在发生错误时的样子是什么? –

回答

0

解决办法:

我使用TCustomPanel为TModulBase的祖先,但我看到的问题,雷米是正确的。和他们我删除祖先类替换一个接口和所有我的另一个插件必须使用相同的接口(如果您使用这种方式与普通的dll项目,你会得到一个不同的错误!我试着:(你必须使用它与BPL(BPL是一个dll太))

PIModuleBase = ^IModulBase; 

IModulBase = interface 
    ... 
end; 

单击此按钮是一个公正的例子中,你必须创建一个模件管理器类

Procedure TControllerMain.Btn1OnClick(Sender: TObject); 
type 
    TInitProcedure = function: PIModuleBase; stdcall; 

var 
    h: HMODULE; 
    proc: TInitProcedure; 
    vClass: PIModuleBase; 
begin 
    h := LoadPackage('test.bpl'); 
    @proc := GetProcAddress(h, 'InitializePlugin'); 
    vClass := proc(); 
    vClass^.setParent(form1); 
    vClass^.setPosition(0,0,100,100); 
    vClass^.play(PChar('url of media')); 
    //UnloadPackage(h); 
end; 



type 
    TVLCVideo = class(TCustomPanel, IModulBase) 
    private 
    ... 
    public 
    ... 
    end; 
function InitializePlugin: PIModuleBase; stdcall; 


implementation 
function InitializePlugin: PIModuleBase; 
var 
v : TVLCVideo; 
begin 
    v := TVLCVideo.Create(nil); 
    Result := IModuleBase(v); 
end; 


exports 
    InitializePlugin; 

end. 

重要的事情:

您不能导入接口库文件直接或在主应用程序模块包文件合作项目!您必须为接口和共享库文件创建一个新的bpl项目,并且您需要将它放入您的模块包中,需要像vlc,rtl这样的部分。

你需要这个接口封装

Build with runtime packages

enter image description here