0

私は「伝統」の働きについて十分な知識を持ってい.dllます。dynamic loadingまた、との違いstatic loadingなど。

しかし、COM オブジェクトの動作について次の疑問があります。

  • COM オブジェクトを に登録することは必須regsvr32ですか?
  • 登録済みの 2 つのバージョンをCOM object同じ/異なるディレクトリに置くことはできますか?
  • .dll ファイル内にパッケージ化されている以外に、「従来型」.dllと「?」の間に共通点はありCOM objectますか?
4

3 に答える 3

4

はい、COM アセンブリは登録されているため、COM インフラストラクチャはその存在を認識しています。DLL は、パスではなく、CLSID の登録によって検出されます。

名前が異なる場合、2 つのバージョンが共存する可能性があります (フォルダーに同じ名前のファイルを含めることはできません)。

すべての COM オブジェクトは特定のインターフェイスを実装しています (IUnknown、多くは IDispatch を持っています)。COM が実際にどのように機能するかは、ここに投稿できる内容を超えた主題です。ATL Internals のような書籍を入手したり、オンラインの COM チュートリアルを実行したりすることができます。

于 2009-01-14T14:32:15.067 に答える
4

1) いいえ - COMオブジェクトを登録する必要はありません。新しいCOM オブジェクトを作成するには、登録が必要です。COM オブジェクトを必要とする多くのインターフェイス (COM またはネイティブ関数) があります。それらの API は、COM オブジェクトがどのインターフェイスをサポートする必要があるかを示します。既存の COM オブジェクトを渡すため、COM オブジェクトを作成するために登録情報は必要ありません。このシナリオのバリエーションは、作成された COM オブジェクトを登録できる実行中のオブジェクト テーブルです。これらのオブジェクトも自分で作成したものであり、登録情報は必要ありません。

インターフェースの例: IQueryCancelAutoplay。

2) COMオブジェクトがメモリ内に存在する。おそらく、COM ファクトリと共に DLL に実装された COMクラスについて考えているでしょう。COM クラスは GUID によって登録されます。DLL ごとに複数のクラス = GUID を持つことができますが、クラスごとに 1 つの DLL しかありません。呼び出し元は COM にクラスのインスタンスを要求することを思い出してください。同じクラスを実装する 2 つの DLL がある場合、COM はどの DLL をロードしますか?! もちろん、それぞれが 1 つのクラスを実装する 2 つの DLL が存在する可能性があり、2 つのクラスはいくつかのインターフェイスを共有します。それらは常に IUnknown を共有します。たとえば、多くの場合 IDispatch ですが、まれに IAcmeCorpFooBarv2

3) A COM DLL is a normal DLL which (a) exposes some COM-specific functions and (b) is registered so the COM framewrok can call LoadLibrary on it. The DLL may also expose other non-COM functions. As a result, you can call LoadLibrary on a COM DLL yourself. This can occasionally be useful to reduce the latency involved in creating your first COM object.

于 2009-01-14T15:57:32.413 に答える
3

1) Reg-Free COMというものを使っていない場合は登録必須

2) CLSID から ProgID へのマッピングが同じ 2 つの COM オブジェクトは登録できません。

3) 最終的には、従来の dll と COM dll の両方にマシン コードが含まれています。インターフェースの実装がなければ、コードの書き方にも大きな違いはありません。

于 2009-01-14T14:39:49.293 に答える