Delphi XE2无法获得BPL插件的工作

时间:2011-10-08 19:42:23

标签: delphi plugins module delphi-xe2 bpl

我尝试使用XE2实现一个简单的模块系统但无法使其工作。当我尝试在IDE下运行它时,我可以从LoadPackage()获取句柄但是不能使用GetClass()获取该类(即使它是在BPL的初始化部分中编辑的RegisterClass())。当我尝试在Windows下运行它时,我得到“此应用程序无法启动,因为找不到rtl160.bpl”错误,甚至无法加载包。

模块代码

type
  TfrModule = class(TFrame)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

implementation

{$R *.dfm}

procedure TfrModule.Button1Click(Sender: TObject);
begin
  ShowMessage('Hello');
end;

initialization
  RegisterClass(TfrModule);
  ShowMessage('Registered');

finalization
  UnregisterClass(TfrModule);
  ShowMessage('Unregistered');

此外,初始化部分未执行,因为我没有看到“已注册”消息框。

主机应用程序是这样的;

var
  hMod: HModule;
  fcMod: TPersistentClass;
  frMod: TFrame;

procedure TForm4.Button1Click(Sender: TObject);
begin
  hMod := LoadPackage('Module.bpl');
  if (hMod = 0) then Exit;

  fcMod := GetClass('TfrModule');
  if Assigned(fcMod) then
  begin
    frMod := TFrame(fcMod.Create);
    frMod.Parent := Panel1;
  end;
end;

主机应用已与运行时套件True相关联。模块没有运行时包选项。

另一个问题。我在网上看到了这个基本的例子,但我打算添加更多类似的模块,如果我在初始化时尝试RegisterClass()第二个模块的TfrModule类,会发生什么?如果我需要为每个模块指定不同的名称,那么无论如何都没有模块。我的意思是,如果主持人必须确切知道模块的类是什么样的。

1 个答案:

答案 0 :(得分:0)

这里一切正常。主机应用程序仅使用运行时包vcl和rtl。该模块还需要rtl和vcl包。这些包也必须部署。我看到一个'Registered'消息框,GetClass函数也被成功调用...