2011-11-13 265 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