QueryInterface

オブジェクトから静的に提供される機能を (インスタンス化される前に) オブジェクトで表現できるメカニズムはありますが、基礎的な COM メカニズムでは QueryInterface と呼ばれている IUnknown メソッドが使用されます。

すべてのインターフェイスは IUnknown から派生します。そのため、すべてのインターフェイスには QueryInterface の実装があります。 実装に関係なく、このメソッドでは、呼び出し元でポインターを必要とするインターフェイスの IID を利用し、オブジェクトにクエリを実行します。 オブジェクトでそのインターフェイスがサポートされている場合、QueryInterface はインターフェイスへのポインターを取得し、同時に AddRef を呼び出します。 それ以外の場合は、E_NOINTERFACE エラー コードを返します。

参照カウント ルールは、必ず従う必要があります。 インターフェイス ポインターで Release を呼び出し、参照カウントを 0 にデクメントする場合、そのポインターを再度使用することはできません。 場合によっては、オブジェクトへの弱い参照を取得する必要がありますが (つまり、参照カウントをインクリメントすることなく、そのインターフェイスの 1 つへのポインターを取得します)、QueryInterface を呼び出し、Release を続けることでこれを行うことは許容されません。 このような方法で取得されたポインターは無効であり、使用できません。 _ATL_DEBUG_INTERFACES が定義されているとき、これは一層明らかになります。そのため、このマクロを定義することは、参照カウント バグを見つける方法として便利です。

関連項目

COM の概要
QueryInterface: オブジェクト内の移動