Я пытался реализовать простую модульную систему с XE2, но не смог заставить ее работать. Когда я пытаюсь запустить его в среде IDE, я могу получить дескриптор из LoadPackage()
, но не могу получить класс с GetClass()
(даже если он был RegisterClass () ed в разделе инициализации 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 второго модуля при его инициализации? Если мне нужно дать другое имя для каждого модуля, в любом случае, нет никакого смысла в модулях. Я имею в виду, если хост должен точно знать, как выглядят классы модуля.