Figure 7.5. IUnknown Interface
interface IUnknown { HRESULT QueryInterface (REFIID iid, void **ppvObject); ULONG AddRef (void); ULONG Release (void); };
Figure 7.6. IDispatch Interface
interface IDispatch { HRESULT GetTypeInfoCount (unsigned int FAR *pcTInfo); HRESULT GetTypeInfo ( unsigned int iTInfo, LCID lcid, ITypeInfo FAR* FAR* ppTInfo); HRESULT GetIDsOfNames ( REFIID riid, OLECHAR FAR* FAR* rgszNames, unsigned int cNames, LCID lcid, DISPID FAR* rgDispId); HRESULT Invoke ( DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS FAR* pDispParams, VARIANT FAR* pVarResult, EXCEPINFO FAR* pExcepInfo, unsigned int FAR* puArgErr); };
Pri kombinovani objektu dve moznosti, nazyvane containment a aggregation. Containment je normalni, kdy vnejsi objekt ma instanci vnitrnich a deleguje jim volani. Aggregation je podobne dedicnosti, kdy vnejsi objekt vyvazi pointery na vnitrni. Tohle ma pochopitelny problem s IUnknown, protoze vyvezenim pointeru dostanu pristup ke QueryInterface agregovaneho objektu a musim nejak zarucit, ze mi bude umet najit i ostatni objekty agregace.
Reseni ala Microsoft je rici, ze agregovatelny objekt musi vedet o tom, ze je soucasti agregatu. Vsechna volani QueryInterface, AddRef a Release na jina rozhrani nez IUnknown se pak musi forwardovat na agregat.