2009-05-05 9 views
5

私は、CoCreateInstanceが指定されたクラスidのCOMサーバーを見つけ、そのIDのオブジェクトインスタンスを作成し、そのオブジェクトインスタンスからインターフェイスを取得することを理解します。 CoGetClassObject()は、クラスidのCOMサーバーを検索し、そのクラスIDのクラスファクトリのインスタンスを作成し、実際のオブジェクトを作成するために使用できるそのクラスファクトリインターフェイスを取得します。同じマシン上にオブジェクトを作成するとき、CoCreateInstance()とCoGetClassObject()の違いは何ですか?

同じマシン上にオブジェクトを作成する際に、これらの機能がどのように異なるのですか?それらは同じ方法で動作しますが、まったく同じCOMサーバーで異なるコードが呼び出されるだけですか?

答えて

8

CoGetClassObjectは、基本的に特定のインターフェイスのファクトリへのポインタを返します。 CoCreateInstanceはCoGetClassObjectを使用します。 CoGetClassObjectを呼び出す利点は、特定のオブジェクトの多数のインスタンスを作成する場合にクラス・ファクトリを1回作成するだけで済むということです。

CoGetClassObjectのMSDNセクションでは、この機能をどのように活用できるかについて簡単に説明しています。 JaredParが言ったことに加えて

+0

私はそれを読んだことがありますが、CoGetClassObject()が潜在的に高速であり、クラスファクトリオブジェクトがCreateInstance()呼び出しの間に状態を維持できること以外は何のメリットもありません。 – sharptooth

+1

@sharptooth、それはそれのかなりのジストです。それほど多くの利点がないため、あなたはそれが使用されることはめったにありません。 – JaredPar

+0

依存関係を検索する順序のような微妙な違いがありますか?これらの機能は同じですが、同じCOMサーバーで異なるコードを呼び出すだけですか? – sharptooth

1

1つのシナリオ - CoGetClassObjectには、あなたのクラスファクトリを返しますが(いるDllGetClassObjectは、インプロセスサーバーの場合には、あなたのDLLの関数をエクスポート呼び出します)。クラスファクトリは、コクラスをインスタンス化するために使用されます。 CoCreateInstanceは内部的にCoGetClassObjectを呼び出し、必要なクラスファクトリを取得し、それを使用して要求したコクラスをインスタンス化します。 CoCreateInstanceを呼び出すと、コクラスの作成を遅らせることはできません。コクラスの作成にはコストがかかる可能性があり、その作成を遅らせたいが、依然としてクラスファクトリにアクセスできるので、必要に応じてコクラスをインスタンス化することができます。

関連する問題