QueryInterface
オブジェクトから静的に提供される機能を (インスタンス化される前に) オブジェクトで表現できるメカニズムはありますが、基礎的な COM メカニズムでは QueryInterface
と呼ばれている IUnknown
メソッドが使用されます。
すべてのインターフェイスは IUnknown
から派生します。そのため、すべてのインターフェイスには QueryInterface
の実装があります。 実装に関係なく、このメソッドでは、呼び出し元でポインターを必要とするインターフェイスの IID
を利用し、オブジェクトにクエリを実行します。 オブジェクトでそのインターフェイスがサポートされている場合、QueryInterface
はインターフェイスへのポインターを取得し、同時に AddRef
を呼び出します。 それ以外の場合は、E_NOINTERFACE
エラー コードを返します。
参照カウント ルールは、必ず従う必要があります。 インターフェイス ポインターで Release
を呼び出し、参照カウントを 0 にデクメントする場合、そのポインターを再度使用することはできません。 場合によっては、オブジェクトへの弱い参照を取得する必要がありますが (つまり、参照カウントをインクリメントすることなく、そのインターフェイスの 1 つへのポインターを取得します)、QueryInterface
を呼び出し、Release
を続けることでこれを行うことは許容されません。 このような方法で取得されたポインターは無効であり、使用できません。 _ATL_DEBUG_INTERFACES
が定義されているとき、これは一層明らかになります。そのため、このマクロを定義することは、参照カウント バグを見つける方法として便利です。