私は、ActiveX DLL を使用して別の一般的なアプリ (より適切な言葉がないため、別名「ホスト」アプリ) に接続する Delphi 6 アプリを持っています。ホスト アプリは統合 DLL を提供します。私はそのソースコードやそれを制御するものを持っていません。DLL を使用するには、IDEインポート ActiveX コントロール機能を使用して TypeLib を作成します。
この問題は、ホスト アプリ ベンダーが ActiveX DLL の新しいバージョンを作成するときに発生します。ユーザーがホスト アプリ ベンダーの最新バージョンまたはベータ バージョンにアップグレードするときに、ユーザーに新しいバージョンのプログラムを提供する必要があります。そうしないと、古い TypeLib と新しい DLL の違いにより、統合 DLL に対して特定の呼び出しが行われると、もちろんアプリがクラッシュします。これは、ホスト アプリの古いバージョンをまだ使用しているユーザーのサポートを維持するために、アプリの複数のコード ベースを維持する負担にもつながります。実行時に現在の DLL バージョンに適応できるコードのバージョンを作成するために、統合 DLL によって公開されているすべてのものを目に見えるようにラップする、大規模で厄介なコードのオーバーホールを回避しようとしています。
それが私の質問につながります。Delphi によって生成される TypeLib は、IDispatch のメソッドとプロパティの大きなリストです。どうやら、Delphi コンパイラはこれらをバックグラウンドで IDispatch.Invoke() 呼び出しに変換します。これで、 CoCreate() を呼び出して ActiveX オブジェクトを作成する前に、ホスト アプリの現在のバージョンを検出できます。では、実行時に 2 つの DLL TypeLib 定義を切り替える方法はありますか? 現在、ビルド対象のホスト アプリのバージョンに基づいた正しい TypeLib を含むコンパイル時の条件を使用して実行しています。これができるのは、TypeLib の各バージョンを保持し、ベンダーが DLL を更新するときに一意の名前を付けるからです。しかし、それは実行時にそれを行うのに役立ちません。
定義された変数からメソッド呼び出しまでのすべてがコンパイルされた TypeLib に基づいているため、これを行う方法を理解することはできません。しかし、これを実現するために IDispatch レベルでできる賢い方法があるかどうか疑問に思っていました。そうしないと、ホスト アプリの現在のバージョンに基づいて正しい TypeLib メソッド/プロパティ定義を呼び出す、公開された各オブジェクトのラッパーを作成するのに行き詰まります。これは大きな仕事であり、かなり複雑なコードにもなります。
これと同じ苦境に直面した人は、どのように解決したり対処したりしましたか?