我正在尝试使用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.
答案 0 :(得分:0)
解决方案:
我使用TCustomPanel作为TModulBase的祖先,但我看到了问题,Remy是对的。和他们我删除祖先类替换接口和我的所有其他插件必须使用相同的接口(如果你使用这种方式与正常的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。
您需要使用此接口包构建主应用程序