QueryInterface guidelines
For this discussion, assume we have a COM object with three interfaces IA
, IB
, and IC
.
Symmetric property
The symmetric property states that if a call to IA::QueryInterface(IID_IB, ...)
is successful, a call to
IB::QueryInterface(IID_IA, ...)
must be successful.
Reflexive property
The reflexive property states that a call to IA::QueryInterface(IID_IA, ...)
must succeed.
Transitive property
The transitive property states that if a call to IA::QueryInterface(IID_IB, ...)
succeeds, and is followed by a call to IB::QueryInterface(IID_IC, ...)
that succeeds, than a call to
IA::QueryInterface(IID_IC, ...)
must succeed.
These rules enforce the basic navigation principle: Given a pointer into an instance of a COM object, a client must be able to navigate to an instance of another interface implemented by the object.
Note that the COM specification does not state which interface pointer is to return in these calls. An object can choose to return pointers
to existing interfaces or create instances on demand. The only requirement constraining which interface pointer to return is for IUnknown
.
As stated previously, because IUnknown
is used as an object's identity, all QueryInterface
calls into any interface within the object must return the same value for IUnknown
.