オブジェクト上のインターフェイスへの最初のポインターを取得した後、COM には、オブジェクトが別の特定のインターフェイスをサポートしているかどうかを調べる非常に単純なメカニズムがあり、サポートされている場合は、そのインターフェイスへのポインターを取得します。 (オブジェクト上のインターフェイスへの初期ポインターの取得については、「オブジェクトへのポインターの取得」を参照してください)。このメカニズムは、IUnknown インターフェイスの QueryInterface メソッドです。 オブジェクトが要求されたインターフェイスをサポートしている場合、メソッドはそのインターフェイスへのポインターを返す必要があります。 これにより、オブジェクトは、オブジェクトがサポートするインターフェイスを自由に移動できます。 QueryInterface では、ネゴシエーションが成功すると、要求 "特定のコントラクトをサポートしていますか?" と、そのコントラクトの高パフォーマンスの使用が分離されます。
クライアントが最初にオブジェクトにアクセスすると、そのクライアントは、少なくとも、オブジェクトの有効期間を制御できる IUnknown インターフェイス ポインター (最も基本的なインターフェイス) を受け取り、オブジェクトの使用が完了したときにオブジェクトに指示し、QueryInterface呼び出します。 クライアントは、管理する各オブジェクトに対していくつかの操作を実行するようにプログラムされていますが、IUnknown インターフェイス には、これらの操作の機能がありません。 代わりに、これらの操作は他のインターフェイスを介して表現されます。 したがって、クライアントは、これらのインターフェイスのオブジェクトとネゴシエートするようにプログラムされます。 具体的には、クライアント QueryInterface を呼び出して、クライアントが目的の操作を呼び出すインターフェイスをオブジェクトに要求します。
オブジェクトは QueryInterface実装するため、要求を受け入れるか拒否することができます。 オブジェクトがクライアントの要求を受け入れる場合、QueryInterface は、要求されたインターフェイスへの新しいポインターをクライアントに返します。 そのインターフェイス ポインターを使用して、クライアントはそのインターフェイスのメソッドにアクセスできます。 一方、オブジェクトがクライアントの要求を拒否 場合、QueryInterface は null ポインター (エラー) を返し、クライアントは目的の関数を呼び出すポインターを持っていません。 この場合、クライアントはその可能性を適切に処理する必要があります。 たとえば、クライアントがオブジェクトのインターフェイス A へのポインターを持ち、インターフェイス B と C を要求するとします。また、オブジェクトはインターフェイス B をサポートしているが、インターフェイス C はサポートしていないとします。結果として、オブジェクトは B へのポインターを返し、C がサポートされていないことを報告します。
重要なポイントは、オブジェクトが QueryInterfaceの呼び出しを拒否すると、クライアントが要求されたインターフェイスを介して表現された操作を実行するようにオブジェクトに要求できないことです。 クライアントには、そのインターフェイスでメソッドを呼び出すインターフェイス ポインターが必要です。 オブジェクトが要求されたポインターの提供を拒否した場合、クライアントは、そのオブジェクトで行うことを意図した操作を行わないか、あるいは別の(おそらくあまり強力ではない)インターフェイスを利用することによって、ポインターなしでやりくりする準備をする必要があります。 COM 機能のこの機能は、その関数を呼び出すまで関数が機能するかどうかを知ることができない他のオブジェクト指向システムと比較して適切に機能します。その場合でも、エラーの処理は不確かです。 QueryInterface は、オブジェクトがメソッドを呼び出す前にインターフェイスをサポートしているかどうかを知るための信頼性の高い一貫した方法を提供します。
QueryInterface メソッドは、オブジェクトが特定のコントラクトをサポートしていないことを示す堅牢で信頼性の高い方法も提供します。 つまり、QueryInterface の呼び出しで、"新しい" インターフェイス (たとえば、古いオブジェクトが出荷された後に発明されたもの) をサポートしているかどうかを "古い" オブジェクトに要求した場合、古いオブジェクトはクラッシュを引き起こすことなく、確実に "いいえ" と答えます。これをサポートするテクノロジは、IID が割り当てられるアルゴリズムです。 これは小さな点のように思えるかもしれませんが、システムの全体的なアーキテクチャにとって非常に重要であり、新しい機能に関するレガシ要素を照会する機能は、驚くほど、他のほとんどのオブジェクト アーキテクチャには存在しない機能です。
関連トピック