OOPortal OOPortal


COM Aggregation   «Prev  Next»
Lesson 7Aggregation guidelines: inner objects
Objective List the guidelines for aggregated inner objects.

Aggregation Guidelines Inner Objects

To support aggregation, a COM object must provide an implementation that supports the following guidelines.

Nondelegating IUnknown

A COM object implements an object-level IUnknown interface. This means the inner object implements an IUnknown interface that is separate and distinct from other COM interfaces in the object. In COM literature, this is called the nondelegating IUnknown. The nondelegating IUnknown performs normal IUnknown functionality
This guideline requires each COM object that supports aggregation to provide a separate, object-level, IUnknown implementation, that is, the nondelegating IUnknown. The outer COM object will use the nondelegating IUnknown to retrieve interfaces from the inner object and to release the inner object. The nondelegating IUnknown is not visible to the client.

Delegating IUnknown

The IUnknown methods in all interfaces exposed by the inner COM object to the client as part of the aggregation (that is, all QueryInterface, AddRef, and Release methods except those in the object-level IUnknown) must not perform any interface navigation or reference counting.
Instead, they must delegate all calls into the outer object's IUnknown. In COM literature, this type of IUnknown is called a delegating IUnknown because it delegates all functionality to the outer object's IUnknown.

This guideline supports interface navigation and reference counting across multiple objects in the aggregation by centralizing all IUnknown functionality in the outer COM object. This allows the outer COM object's IUnknown to control interface navigation and reference counting on all interfaces, in all aggregated objects.
We will discuss how the inner object gets the outer object's IUnknown pointer in a subsequent lesson.
Implementing nondelegating and delegating IUnknown interfaces with multiple inheritance requires you to specify a stand-alone IUnknown interface. Additionally, this interface must use different names (but the same function attributes and parameter types) for QueryInterface, AddRef, and Release to avoid name conflicts with the IUnknown members of other interfaces.
The following diagram shows a COM object with nondelegating and delegating IUnknown interfaces.

Non-delegating IUnknown interfaces : obQueryInterface, objAddRef, objRelease
Non-delegating IUnknown interfaces : obQueryInterface, objAddRef, objRelease

Aggregation - Exercise

Click the Exercise link below to apply what you have learned about aggregation guidelines. Aggregation - Exercise