Click here to Skip to main content
15,883,623 members
Articles / Programming Languages / C++
Article

Aggregation explained

Rate me:
Please Sign up or sign in to vote.
3.88/5 (11 votes)
1 Feb 20072 min read 46.2K   553   30   5
Article describing the steps involved to attain aggregation relation between COM components

Sample image

Introduction

Let's have a look at the reuse technique "Aggregation" and how we can implement this in COM.

Definition

In this reuse mechanism, The Outer COM directly exposes the Inner COM's interfaces to the client. I will try to explain the steps involved to attain Aggregation relation between the InnerCom and OuterCom in the simplest way possible, so that beginners in COM can understand and workout.

Let's work on an example to establish aggregation relation between the Calculator Component (InnerCom), which already is available with us and ComplexCalculator, which we are going to build now.

Download the Calculator.dll from the source and register it.

Steps:

  • Create a new Project of type Atl COM, name it ComplexCalculator and select the type as "dll".
  • Insert a new Atl Object, select the Simple Object option and Name it ComplexMath.
  • Add a new method to the IComplexMath interface.

Method Name: Divide

Parameters: [in] int x, [in] int y, [out, retval] int* z

Add the following code:

C++
STDMETHODIMP CComplexMath :: Divide (int x, int y, int *z)
{
    *z= x/y;

    return S_OK;
}

Do the following changes to CalculatoeEx.idl:

Copy the object section and the interface section of the Calculator.idl to ComplexCalculator.idl

C++
[
    object,
    uuid(1E48B0F0-010D-4658-A0B6-70300FDA56F1),
    dual,
    helpstring("ISimpleMath Interface"),
    pointer_default(unique)

]

    interface ISimpleMath : IDispatch
    {
        [id(1), helpstring("method Add")] 
            HRESULT Add([in] int x, [in] int y,    
            [out, retval] int* z );
    };

In the coclass part of ComplexCalculator.idl, add the interface name that we want to aggregate.

Note: Changes that need to be done are indicated in bolds.

C++
coclass ComplexMath
{
    [default] interface IComplexMath;
    interface ISimpleMath;
};

Do the following changes to the ComplexCalculator.h:

Copy the CLSID of the SimpleMath from Calculator_i.c to ComplexCalculator.h

C++
const CLSID CLSID_SimpleMath = {0xF58218E0,0x645A,0x473D,
                               {0x84,0x4B,0x30,0x78,0x65,
                                0x03,0x8D,0x9E}};

Do the following change in the COM MAP.

Note: Changes that need to be done are indicated in bolds.

C++
BEGIN_COM_MAP(CComplexMath)
    COM_INTERFACE_ENTRY (IComplexMath)
    COM_INTERFACE_ENTRY_AGGREGATE (IID_ISimpleMath, ptrUnk)
    COM_INTERFACE_ENTRY (IDispatch)
END_COM_MAP () 

Add the following macro, finalconstruct and release methods

C++
DECLARE_GET_CONTROLLING_UNKNOWN()
IUnknown* ptrUnk;

HRESULT FinalConstruct()
{
    return CoCreateInstance(CLSID_SimpleMath,
            GetControllingUnknown(),CLSCTX_ALL, 
            IID_IUnknown, (void**)&ptrUnk);
}

void FinalRelease()
{
    ptrUnk->Release();
}

Search for "Aggregation" in the source code to find code that is inserted to build the relationship between the "Calculator" and "ComplexCalculator".

Note: Register the Calculator.dll and ComplexCalculator.dll before using the demo project.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Web Developer
India India
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
Questionrofl who is the sob unit goat humper who posted this trash Pin
Member 125092437-May-16 14:08
Member 125092437-May-16 14:08 
AnswerMessage Closed Pin
7-May-16 18:30
hearkeybluecome7-May-16 18:30 
GeneralThanks Pin
Kamal Ramya Santharam19-Sep-08 1:15
Kamal Ramya Santharam19-Sep-08 1:15 
I got it what I expected. Thanks.
GeneralInvoking from VBScripts Pin
Clement Emerson5-Sep-08 22:12
Clement Emerson5-Sep-08 22:12 
GeneralThanks Pin
kev~15-May-07 1:44
kev~15-May-07 1:44 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.