MDI の子としてプラグインの形式で .bpl パッケージをロードする MDI アプリケーション (Delphi 7) を開発しています。開くことができるプラグインのインスタンスは 1 つだけですが、明らかに複数のプラグインを同時に開くことができます。
MDI 親で利用可能な特定のコンポーネントを「共有」するために使用される共通クラスであるクラスがあります。これは、関連する各コンポーネントの構築時に共通クラスにポインタを格納させることで実現しています。
例えば:
...
TCommonClass = class(TObject)
public
MainMenu: ^TMainMenu;
MyClass: ^TMyClass;
...
constructor TCommonClass.Create;
var
CtrlItm: array[0..999] of TComponent;
...
for i := 0 to (Application.MainForm.ComponentCount - 1) do
begin
CtrlItm[i] := Application.MainForm.Components[i];
if CtrlItm[i].ClassName = ‘TMainMenu’ then MainMenu := @CtrlItm[i];
if CtrlItm[i].ClassName = ‘TMyClass’ then MyClass := @CtrlItm[i];
end;
オブジェクトを参照するときはいつでも、次のようにします。
...
var
tmp: String;
begin
MainMenu^.items[0].Caption := 'Something'; //just to demonstrate
MyClass.DoSomething;
end;
すべてのプラグインには、この共通クラスの独自のインスタンスがあり、そのコンポーネントの 1 つを更新すると、MDI 親のコンポーネントが実際に更新されるという考えがあります。このアプローチは、私が最後に書いたプラグイン (かなり大きく、多くの TMS コンポーネントを含む) が追跡できないように見えるエラーを出し始めるまで、うまく機能していました。
私が知りたいのは、このアプローチがメモリ (ポインター) の使用に関して健全であるかどうかです。パッケージのロードとアンロードによって、メモリ マッピングの変更によってポインタが破損する可能性はありますか? これを別の方法で行う必要がありますか?