2016-08-24 2 views
0

私はCOMの凝集を学ぶときCInnerclass::QueryInterfaceINondelegationUnknownに属していないので、なぜpUnkInnerQueryInterfaceを呼び出すことができ、例えば、pUnkInner->QueryInterfaceながら、私は、CInnerclass::INondelegationUnknownインターフェイスにそのCOuterclass::pUnkInnerポイントを知っています。なぜpUnkInnerはCOMの集計でQueryInterfaceを呼び出せるのですか?

+0

*常にインターフェイスポインタでQueryInterfaceを呼び出すことができます。あなたが忘れたかもしれない細部は、すべてのCOMインターフェイスのように、INUnknownGenerationUnknownがIUnknownから派生しているということです。したがって、3つのIUnknownメソッドを継承します。私たちはここからそれを見ることはできませんが、それは通常の方法です。 –

+0

どこからCOMを学習していますか? – acelent

答えて

0

INondelegationUnknownが何であるかわかりません。これはCOMの一部ではなく、おそらく使用しているフレームワーク固有のものです。

しかし、重要な部分は、いずれかの方法で、集約の内部オブジェクトは、IUnknownの2つの異なる実装を提供する必要があります。 1つは委任の実装であり、アグリゲーション関係が最初に確立されたときに、CoCreateInstanceに外部から提供されたIUnknownポインタへのすべての呼び出しを転送します。インナーによって公開されるすべてのインターフェイスは、このように3つのIUnknownメソッドを実装する必要があります。外側のクライアントは、外部のクライアントにそのインターフェイスを渡します。外部に委任することによって、単一のシームレスなオブジェクトの錯覚が維持されます。

IUnknown実装では、参照カウントを管理し、内部オブジェクト(通常のCOMオブジェクトのような)によって実装されるインターフェイスを公開します。これは非委任実装です。外部クラスが内部管理に使用します。それは決して外部に露出されません。外側は、内部で実装されたインターフェイスを取得してからクライアントに渡すために、そして内部を最終的に解放するために、この非委譲ポインターを独自のQueryInterface実装で使用します。

関連する問題