Delphi:找不到资源错误?

时间:2011-11-13 03:12:16

标签: delphi dll

我正在尝试使用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.

1 个答案:

答案 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。

您需要使用此接口包构建主应用程序

Build with runtime packages

enter image description here