IUnknown::QueryInterface
Returns a pointer to a specified interface on an object to which a client
currently holds an interface pointer. This function must call IUnknown::AddRef
on the pointer it returns.
HRESULT QueryInterface(
REFIID iid,
|
//Identifier of the requested interface
|
void ** ppvObject
|
//Indirect pointer to the object
|
);
|
|
Parameters
-
iid
-
[in] Identifier of the interface being requested.
-
ppvObject
-
[out] Indirectly points to the interface specified in iid. If the
object does not support the interface specified in iid, *ppvObject
is set to NULL.
Return Value
S_OK if the interface is supported, E_NOINTERFACE if not.
Remarks
The QueryInterface method gives a client access to other interfaces on
an object.
For any one object, a specific query for the
IUnknown interface on any of the object’s interfaces
must always return the same pointer value. This allows a client to determine
whether two pointers point to the same component by calling QueryInterface
on both and comparing the results. It is specifically not the case that
queries for interfaces (even the same interface through the same pointer) must
return the same pointer value.
There are four requirements for implementations of QueryInterface (In
these cases, “must succeed” means “must succeed barring catastrophic failure.”):
-
The set of interfaces accessible on an object through IUnknown::QueryInterface
must be static, not dynamic. This means that if a call to QueryInterface
for a pointer to a specified interface succeeds the first time, it must
succeed again, and if it fails the first time, it must fail on all subsequent
queries.
-
It must be symmetric &emdash; if a client holds a pointer to an interface on
an object, and queries for that interface, the call must succeed.
-
It must be reflexive &emdash; if a client holding a pointer to one interface
queries successfully for another, a query through the obtained pointer for the
first interface must succeed.
-
It must be transitive &emdash; if a client holding a pointer to one interface
queries successfully for a second, and through that pointer queries
successfully for a third interface, a query for the first interface through
the pointer for the third interface must succeed.