我正在尝试使用 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.
最佳答案
解决方案:
我使用 TCustomPanel 作为 TModulBase 的祖先,但我发现了问题,Remy 是对的。我删除了祖先类以替换为接口(interface),并且我的所有其他插件都必须使用相同的接口(interface)(如果您在正常的 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.
重要的事情:
不能直接将接口(interface)库文件导入到模块包文件中,也不能在主应用项目中导入!您必须为接口(interface)和共享库文件创建一个新的 bpl 项目,并且您需要将它们放入您的模块包中,例如 vlc、rtl。
并且您需要使用此接口(interface)包构建主应用程序
关于Delphi:找不到资源错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8109332/