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クラスを試してみるとどうなりますか?モジュールごとに異なる名前を付ける必要がある場合でも、モジュールの意味はありません。つまり、ホストがモジュールのクラスがどのように見えるかを正確に知る必要がある場合です。