c ++ - Hvorfor hentes IUnknown * -pegerne gennem forskellige grænseflader af samme COM-objekt, har samme værdi?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har følgende hierarki af COM-grænseflader og en klasse, der implementerer dem:


interface IX : public IUnknown{};
interface IY : public IUnknown{};
class CA: public IX, public IY{};


Her class CA arver reelt fra IUnknown to gange.


Vi ved, at der er to vtable pointers i class CA - en er peget på IX og en anden er peget på IY. Så IUnknown gemt i IX underobjektet er forskelligt fra IUnknown gemt i IY underobjekt.


Men når vi kalder IX::QueryInterface() eller IY::QueryInterface() på samme objekt og forespørger IUnknown, får vi identiske IUnknown* pointers.


Hvorfor sker det?

Bedste reference


Det såkaldte 'objektidentitetskrav', der angiver, at når du beder om IUnknown fra to objekter, får du forskellige pointer, hvis de er forskellige objekter og lige pointer, hvis det er samme objekt. [19]


Hver QueryInterface() gennemførelse skal opfylde dette krav. Dette gøres normalt ved at vælge hvilket IUnknown der skal returneres og holde sig til:


HRESULT CA::QueryInterface( REFIID iid, void** ppv )
{
    if( iid == \_\_uuidof( IUnknown ) ) {
        // Explicitly cast to one of base class subobjects.
        // Doesn't matter which one is chosen - it just has to be
        // the same base class subobject each time IUnknown is requested.
       IUnknown* selected = static\_cast<IX*>( this );
       *ppv = selected;
       AddRef();
       return S\_OK;
    } else {
       continue for other interfaces
    }
}