私はBPLを使用してdelphi2010でモジュール式アプリケーションを作成しようとしています。
問題は、BPL内でクラスを作成しようとすると、このエラーメッセージが表示されます。
私はリソース(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.
ベストアンサー
ソリューション :
私はTModulBaseの祖先にTCustomPanelを使用していましたが、問題が見られた、Remyは正しいです。私は先祖クラスをインタフェースで置き換え、他のすべてのプラグインは同じインタフェースを使用しなければなりません(通常のdllプロジェクトでこの方法を使用すると、別のエラーが発生します!
bpl(bplもdllです))
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.
大事なこと :
インターフェイスライブラリファイルをモジュールパッケージファイルに直接またはメインのアプリケーションプロジェクトにインポートすることはできません!あなたはインターフェイスと共有ライブラリファイルのためだけに新しいbplプロジェクトを作成しなければなりません。それらのモジュールパッケージをvlc、rtlのような必須セクションに配置する必要があります。
そして、あなたはこのインタフェースパッケージでメインアプリケーションを構築する必要があります