2011-11-13 16 views
3

私はBPLを使用してdelphi2010でモジュラーアプリケーションを作成しようとしています。 問題BPL内でクラスを作成しようとすると、このエラーメッセージが表示されます。Delphi:リソースが見つかりませんでしたか?

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

の主なアプリケーションを構築する必要がありますが、 'TModuleBase'がTForm''由来している場合にのみ、 'TFrame'、または' TDataModule'であり、 'TCustomPanel'からではありません。 –

+0

Okey、dllでコンポーネントを使用する方法はありますか?私はActiveXコンポーネントを作成したくありません – relativ

+1

'InitializePlugin()'がクラス型ではなくインスタンス化されたオブジェクトを返す場合、同じ問題がありますか?エラーが発生したときのコールスタックの外観は何ですか? –

答えて

0

ソリューションです:

私はTModulBaseの祖先のためTCustomPanelを使用しましたが、私は問題を見られた、レミーは正しいです。私は先祖クラスをインタフェースで置き換え、他のすべてのプラグインは同じインタフェースを使用しなければなりません(通常のdllプロジェクトでこの方法を使用すると、別のエラーが発生します! (BPLがあまりにもDLLである))BPLと

PIModuleBase = ^IModulBase; 

IModulBase = interface 
    ... 
end; 

このボタンをクリックするだけで、あなたがMODULマネージャクラスに

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. 

重要なものを作成する必要がサンプルです:

あなたがインポートすることはできませんがモジュール・パッケージ・ファイルへのインターフェース・ライブラリー・ファイルの直接またはメイン・アプリケーションicationプロジェクト!あなたはインターフェイスと共有ライブラリファイルのためだけに新しいbplプロジェクトを作成しなければなりません。それらのモジュールパッケージをvlc、rtlのような必須セクションに配置する必要があります。

そして、あなたは、このインタフェースパッケージエラーの種類がDFMストリーミング中に発生する

Build with runtime packages

enter image description here