私は、BPL を動的にロードし、オブジェクト インスタンスをメイン アプリから BPL のメソッドに渡すというアイデアをいじっていました。これにより、アプリケーションで使用されるユニットと BPL で使用されるユニットの間で問題が発生します。
私はこれを行う小さなプロトタイプを作成し、Delphi がアプリで定義されたクラスと BPL で定義されたクラスの間の違いを内部的にどのように管理しているかに興味を持っていました。
たとえば、次のような基本的な Widget クラスがあるとします。
TmyWidget = class
private
fId:Integer;
fDescription:String;
public
procedure DoSomething1();
end;
これで、TmyWidget クラスを含むユニットを使用して、アプリと BPL がビルドされました。その後、TMyWidget で何かが変更され、アプリが再構築されましたが、BPL はそうではありません (またはその逆です)。別のメソッド DoSomething2() を追加し、アプリで TmyWidget のインスタンスを作成し、処理のために BPL に渡しました。基本的な例、うまくいきました。しかし、それは明らかに潜在的な問題をはらんでいます。
動的にロードされる別の BPL も TmyWidget を使用する場合、事態はさらに興味深いものになります。機能しているように見えますが、理想的ではありません。
主な質問は、通常、メイン アプリケーションと DLL または BPL との間でオブジェクトをどのように受け渡すかということです。これまでに試みたことはなく、おそらく正当な理由がありますが、このアプローチに役立つこのアイデアを思いつきました...
最良のアプローチは、オブジェクトをシリアル化し、それらのバイトを渡し、DLL/BPL で逆シリアル化することだと思いますが、このプロセスでは、ホストと動的に読み込まれるモジュールの間の潜在的なバージョンの違いに注意を払っていますが、新しい SimpleSharedMem を望んでいましたオプションは、シリアル化のオーバーヘッドなしでこの新しい機能をもたらす可能性がありますが、共有コードの変更に合わせてアプリと dll を再構築することを厳密に維持しない限り、あまり役に立たないようです...しかし、このプロトタイプでは、アプリはかなり一定のままですまた、動的にロードされるモジュールは、TmyWidget に機能が追加されて頻繁に変更されます。(サーバー アプリは、クライアントの要求に基づいて TmyWidget を構築するためのファクトリとして機能し、アプリは処理のためにさまざまなモジュールにインスタンスを渡します。)