The following classes implement IUnknown and related methods:
- CComObjectRootEx Manages reference counting for both aggregated and nonaggregated objects. Allows you to specify a threading model. 
- CComObjectRoot Manages reference counting for both aggregated and nonaggregated objects. Uses the default threading model of the server. 
- CComAggObject Implements IUnknown for an aggregated object. 
- CComObject Implements IUnknown for a nonaggregated object. 
- CComPolyObject Implements IUnknown for aggregated and nonaggregated objects. Using CComPolyObject avoids having both CComAggObject and CComObject in your module. A single CComPolyObject object handles both aggregated and nonaggregated cases. 
- CComObjectNoLock Implements IUnknown for a nonaggregated object, without modifying the module lock count. 
- CComTearOffObject Implements IUnknown for a tear-off interface. 
- CComCachedTearOffObject Implements IUnknown for a "cached" tear-off interface. 
- CComContainedObject Implements IUnknown for the inner object of an aggregation or a tear-off interface. 
- CComObjectGlobal Manages a reference count on the module to ensure your object won't be deleted. 
- CComObjectStack Creates a temporary COM object, using a skeletal implementation of IUnknown. 
Related Articles
Fundamentals of ATL COM Objects