Delphi XE2无法使BPL插件工作

Delphi XE2无法使BPL插件工作,delphi,plugins,module,delphi-xe2,bpl,Delphi,Plugins,Module,Delphi Xe2,Bpl,我试图用XE2实现一个简单的模块系统,但无法让它工作。当我尝试在IDE下运行它时,我可以从LoadPackage获得一个句柄,但无法使用GetClass获得该类,即使它是在BPL的初始化部分中注册的。当我尝试在Windows下运行它时,我发现这个应用程序无法启动,因为rtl160.bpl找不到错误,甚至无法加载包 模块代码 type TfrModule = class(TFrame) Button1: TButton; procedure Button1Click(Sende

我试图用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。模块没有运行时包选项


另一个问题。我在网上看到了这个基本示例,但我计划添加更多类似的模块,如果我尝试在第二个模块的TfrModule类初始化时注册该类,将会发生什么?如果我需要为每个模块指定不同的名称,那么模块就没有意义了。我的意思是,如果主机必须确切知道模块的类是什么样子的话。

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

由于未找到rtl160.bpl,此应用程序无法启动,原因是运行时软件包未正确安装在计算机上。您是否在除dev机器之外的其他机器上运行?不,David,两者都在同一台机器上运行。问题是,我也尝试使用运行时包False,但结果相同。请检查您的路径是否包含包含RTL160.BPL和VCL160.BPL文件的文件夹。我在Delphi 7上编译了模块和主机,并且能够看到注册的消息,这意味着执行了初始化部分,但GetClass仍然返回nil。我还能够在模块代码中设置断点,这在XE2中是不可能的。当我尝试设置断点时,我遇到了异常。我深入研究了代码的执行,发现正在执行的RegisterClass与单元Classes中的完全不同。我真的不知道发生了什么事。