COMテクノロジーは私がしばらく使用していなかったものなので、情報が間違っている可能性がある場合は申し訳ありません(とにかく、私の本「Inside COM + baseservices」を持っています!)
簡単に言えば、COMオブジェクトの簡単な定義を示しましょう。これは、次のメソッドを使用して標準インターフェイスIUnkownを公開するクラスを持つ標準DLLに他なりません。
- AddRef:COMオブジェクトを消費するクライアントを登録します
- リリース:クライアントの登録を解除します(通常、未使用のオブジェクトは実行を停止しますが、他のオブジェクトは常駐している可能性があります)
- QueryInterface:関数のアドレスを取得します
QueryInterfaceは、強力な(コンパイル時にDLLを知る必要はありません)が時間がかかる関数(遅延バインディング)のアドレスを動的に取得するために使用されます。一方、これらのDLLはシステムに登録されているため、コンパイル時に関数のアドレスを直接参照できます(すべての情報はレジストリに保存されます)。
新しいオブジェクトの作成または実行中のオブジェクトのアドレスの取得は、プロキシの役割をロードおよび/または果たすRPC(リモートプロシージャコール)を介して行われます。
したがって、COMオブジェクトの新しいインスタンスを作成するには、CreateObject(VBの場合)(Co)CreateInstanceをVC ++(またはc#?)で呼び出しますが、実行中のインスタンスを取得するには、GetObject()を呼び出します。
COMオブジェクトのリストを取得するのはそれほど簡単ではありません(私はまったく不可能だと思います)。前述のように、COMオブジェクトはDLLに他なりません。これは、ライブラリが主に各プロセスのアドレス空間に読み込まれることを意味します。アクセスはプライベートです。多くのプロセス間でオブジェクトが共有されるアウトプロセスCOMオブジェクト(インプロセスの反対)の場合でも(つまり、ExcelはアウトプロセスCOMオブジェクトです:アプリケーションのアドレス空間にDLLをロードしません)、ホスト(rpc.exeまたは専用ホスト)によってロードされます
これがセルジュに役立つことを願っています