I think you misunderstood the meaning of increasing the size. COM objects only consists of a set of function in a vtable. The vtable is very similar to virtual function in a cpp-class. In COM there is no object cast like in cpp. The object cast is always QueryInterface. If your interface grows up (i.e. some additional function) you MUST use a new cast (IID_MyNewClassVersion1 -> IID_MyNewClassVersion2) inside QueryInterface. To keep published interfaces consistent you can expose a new interface including the additional functions. Thats why the client that uses the interface (this can be another application) relies on the interface layout.
Perhaps imagine you have a interface with 3 functions (the IUnknown functions too) let them call:
<br />
virtual HRESULT __stdcall a() = 0;<br />
virtual HRESULT __stdcall b() = 0;<br />
virtual HRESULT __stdcall c() = 0;<br />
an older application relies on that interface layout. Sometimes later you want to increase functionality you change the layout to:
<br />
virtual HRESULT __stdcall a() = 0;<br />
virtual HRESULT __stdcall b1() = 0;<br />
virtual HRESULT __stdcall b() = 0;<br />
virtual HRESULT __stdcall c() = 0;<br />
in this case the older application will call a function that youve implememnted later (i.e. call function b() will instead call the function b1()).
Otherwise if you update the client that uses that interface it might be older interface provider will been called with a non existing function (i.e. you call c() the implementation will not exist in the older interface).
So you can expose a new interface lets say:
// interface 1 has the guid==IID_MyNewClassVersion1
// contains the functions
<br />
virtual HRESULT __stdcall a() = 0;<br />
virtual HRESULT __stdcall b() = 0;<br />
virtual HRESULT __stdcall c() = 0;<br />
// interface 2 has the guid==IID_MyNewClassVersion2
// contains the functions
<br />
virtual HRESULT __stdcall a() = 0;<br />
virtual HRESULT __stdcall b1() = 0;<br />
virtual HRESULT __stdcall b() = 0;<br />
virtual HRESULT __stdcall c() = 0;<br />
the function query interface distinquish between the different interfaces:
<br />
HRESULT QueryInterface(RIID riid,void** ppv)<br />
{<br />
if(IID_MyNewClassVersion1) return *(MyNewClassVersion1**)ppv=this,AddRef(),S_OK;<br />
if(IID_MyNewClassVersion2) return *(MyNewClassVersion2**)ppv=this,AddRef(),S_OK;<br />
return E_NOINTERFACE;<br />
}<br />
Regards.