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.