Delphi XE2 не может заставить работать плагин BPL - PullRequest
0 голосов
/ 08 октября 2011

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

1 Ответ

0 голосов
/ 09 октября 2011

Здесь все отлично работает.Хост-приложение использует только исполняемые пакеты vcl и rtl.Для модуля требуются также пакеты rtl и vcl.Эти пакеты также должны быть развернуты.Я вижу сообщение "Зарегистрировано", и функция GetClass также успешно вызывается ...

...