【发布时间】: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