Delphi:未找到资源错误?

Delphi:未找到资源错误?,delphi,dll,Delphi,Dll,我正在尝试使用BPL在delphi2010中创建一个模块化应用程序。 问题是当我试图在BPL中创建类时,我收到了这个错误消息 我没有对资源(RES文件)做任何操作 dll代码 TModuleBase是一个TCustomPanel type TVLCVideo = class(TModuleBase) private ... public ... end; function InitializePlugin: TModuleBaseClass; stdcall;

我正在尝试使用BPL在delphi2010中创建一个模块化应用程序。 问题是当我试图在BPL中创建类时,我收到了这个错误消息

我没有对资源(RES文件)做任何操作

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是对的。我删除了祖先类以替换为接口,我的所有其他插件都必须使用相同的接口(如果你用这种方式处理普通的dll项目,你会得到不同的错误!我尝试过:(你必须用bpl来使用它(bpl也是dll))

此按钮单击只是一个示例,您必须创建一个模块管理器类

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项目,并且您需要将它们放入模块包的requires部分,如vlc、rtl

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


在DFM流媒体传输过程中会发生这种错误,但前提是
TModuleBase
来自
TForm
TFrame
TDataModule
,而不是
TCustomPanel
。好的,你能告诉我有没有办法在dll中使用组件吗?我不想创建ActiveX组件,你没有如果
初始化plugin()也会出现同样的问题
返回一个实例化的对象而不是类类型?发生错误时调用堆栈是什么样子的?谢谢Remy,我用interfaces@relative,请您粘贴此解决方案作为答案,并自行接受。这可能会对将来遇到相同问题的访问者有所帮助。
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.