For the latest documentation on Visual Studio 2017 RC, see Visual Studio 2017 RC Documentation.
This class implements IUnknown for an aggregated or nonaggregated object.
template<class contained> class CComPolyObject : public IUnknown, public CComObjectRootEx<contained::_ThreadModel::ThreadModelNoCS>
|CComPolyObject::AddRef||Increments the object's reference count.|
|CComPolyObject::CreateInstance||(Static) Allows you to create a new CComPolyObject< |
|CComPolyObject::FinalConstruct||Performs final initialization of |
|CComPolyObject::FinalRelease||Performs final destruction of |
|CComPolyObject::QueryInterface||Retrieves a pointer to the requested interface.|
|CComPolyObject::Release||Decrements the object's reference count.|
|CComPolyObject::m_contained||Delegates IUnknown calls to the outer unknown if the object is aggregated or to the IUnknown of the object if the object is not aggregated.|
CComPolyObject implements IUnknown for an aggregated or nonaggregated object.
When an instance of
CComPolyObject is created, the value of the outer unknown is checked. If it is NULL, IUnknown is implemented for a nonaggregated object. If the outer unknown is not NULL, IUnknown is implemented for an aggregated object.
The advantage of using
CComPolyObject is that you avoid having both CComAggObject and CComObject in your module to handle the aggregated and nonaggregated cases. A single
CComPolyObject object handles both cases. This means only one copy of the vtable and one copy of the functions exist in your module. If your vtable is large, this can substantially decrease your module size. However, if your vtable is small, using
CComPolyObject can result in a slightly larger module size because it is not optimized for an aggregated or nonaggregated object, as are
DECLARE_POLY_AGGREGATABLE macro is specified in your object's class definition,
CComPolyObject will be used to create your object.
DECLARE_POLY_AGGREGATABLE will automatically be declared if you use the ATL Project Wizard to create a full control or Internet Explorer control.
If aggregated, the
CComPolyObject object has its own IUnknown, separate from the outer object's IUnknown, and maintains its own reference count.
CComPolyObject uses CComContainedObject to delegate to the outer unknown.
For more information about aggregation, see the article Fundamentals of ATL COM Objects.
Increments the reference count on the object.
A value that may be useful for diagnostics or testing.
[in] A pointer to the outer unknown if the object is to be aggregated, or NULL if the object if the object is not aggregated.
CComContainedObject data member, m_contained, and increments the module lock count.
The destructor decrements the module lock count.
Frees all allocated resources, calls FinalRelease, and decrements the module lock count.
Allows you to create a new CComPolyObject<
contained > object without the overhead of CoCreateInstance.
static HRESULT WINAPI CreateInstance( LPUNKNOWN pUnkOuter, CComPolyObject<contained>** pp);
[out] A pointer to a CComPolyObject<
contained> pointer. If
CreateInstance is unsuccessful,
pp is set to NULL.
The object returned has a reference count of zero, so call
AddRef immediately, then use Release to free the reference on the object pointer when you're done.
If you don't need direct access to the object, but still want to create a new object without the overhead of
CoCreateInstance, use CComCoClass::CreateInstance instead.
Called during the final stages of object construction, this method performs any final initialization on the m_contained data member.
Called during object destruction, this method frees the m_contained data member.
A CComContainedObject object derived from your class.
IUnknown calls through
m_contained are delegated to the outer unknown if the object is aggregated, or to the IUnknown of this object if the object is not aggregated.
Retrieves a pointer to the requested interface.
STDMETHOD(QueryInterface)(REFIID iid, void** ppvObject); template <class Q> HRESULT QueryInterface(Q** pp);
The COM interface.
[in] The identifier of the interface being requested.
[out] A pointer to the interface pointer identified by
iid. If the object does not support this interface,
ppvObject is set to NULL.
[out] A pointer to the interface identified by __uuidof(Q).
For an aggregated object, if the requested interface is IUnknown,
QueryInterface returns a pointer to the aggregated object's own IUnknown and increments the reference count. Otherwise, this method queries for the interface through the
CComContainedObject data member, m_contained.
Decrements the reference count on the object.
In debug builds, Release returns a value that may be useful for diagnostics or testing. In nondebug builds, Release always returns 0.