【问题标题】:Delphi XE2 Cannot get BPL plugin workDelphi XE2 无法使 BPL 插件工作
【发布时间】:2011-10-08 19:42:22
【问题描述】:

我尝试用 XE2 实现一个简单的模块系统,但无法让它工作。当我尝试在 IDE 下运行它时,我可以从 LoadPackage() 获取句柄,但无法使用 GetClass() 获取类(即使它是在 BPL 的初始化部分中注册类())。当我尝试在 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 类会发生什么?如果我需要为每个模块指定不同的名称,那么无论如何模块都没有意义。我的意思是,如果宿主必须确切知道模块的类是什么样的。

【问题讨论】:

  • “此应用程序无法启动,因为未找到 rtl160.bpl”是因为运行时软件包未正确安装在机器上。您是否在开发机器以外的机器上运行?
  • 没有 David,两者都在同一台机器上运行。问题是,我也尝试使用运行时包 False,但结果相同。
  • 检查您的路径是否包含包含 RTL160.BPL 和 VCL160.BPL 文件的文件夹。

标签: delphi plugins module delphi-xe2 bpl


【解决方案1】:

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

【讨论】:

  • 我已经在 Delphi 7 上编译了模块和主机,并且能够看到 Registered 消息,这意味着初始化部分被执行,但 GetClass() 仍然返回 nil。我还能够在模块代码中设置断点,这在 XE2 中是不可能的(当我试图设置一个时,我遇到了异常)。我深入研究了代码的执行,发现正在执行的 RegisterClass() 与 Classes 单元中的完全不同。我真的不知道发生了什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-25
  • 1970-01-01
  • 2014-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多