0

XE2で単純なモジュールシステムを実装しようとしましたが、動作させることができませんでした。IDEで実行しようとすると、ハンドルを取得できLoadPackage()ますが、クラスを取得できませんGetClass()(BPLの初期化セクション内でRegisterClass()されている場合でも)。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()です。初期化で2番目のモジュールのTfrModuleクラスを試してみるとどうなりますか?モジュールごとに異なる名前を付ける必要がある場合でも、モジュールの意味はありません。つまり、ホストがモジュールのクラスがどのように見えるかを正確に知る必要がある場合です。

4

1 に答える 1

0

ここではすべてが正常に機能します。ホストアプリはランタイムパッケージvclとrtlのみを使用します。このモジュールには、rtlおよびvclパッケージも必要です。これらのパッケージもデプロイする必要があります。「登録済み」メッセージボックスが表示され、GetClass関数も正常に呼び出されます...

于 2011-10-08T21:18:05.967 に答える