7.13.2. Components

7.13.2.1. IUnknown

Figure 7.5. IUnknown Interface

interface IUnknown
{
  HRESULT QueryInterface (REFIID iid, void **ppvObject);
  ULONG AddRef (void);
  ULONG Release (void);
};

7.13.2.2. IDispatch

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);
};

7.13.2.3. Containment And Aggregation

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.