Delen via


Regels voor het implementeren van QueryInterface

Er zijn drie hoofdregels voor het implementeren van de methode IUnknown::QueryInterface op een COM-object:

  • Objecten moeten identiteit hebben.
  • De set interfaces op een objectexemplaren moet statisch zijn.
  • Het moet mogelijk zijn om query's uit te voeren voor elke interface in een object vanuit een andere interface.

Objecten moeten identiteit hebben

Voor een bepaald objectexemplaren moet een aanroep naar QueryInterface- met IID_IUnknown altijd dezelfde fysieke aanwijzerwaarde retourneren. Hiermee kunt u QueryInterface aanroepen op twee interfaces en de resultaten vergelijken om te bepalen of ze verwijzen naar hetzelfde exemplaar van een object.

De set interfaces op een objectexemplaren moet statisch zijn

De set interfaces die toegankelijk zijn voor een object via QueryInterface- moet statisch zijn, niet dynamisch. Als QueryInterface S_OK voor een bepaalde IID retourneert, mag deze nooit E_NOINTERFACE retourneren bij volgende aanroepen van hetzelfde object; en als QueryInterface E_NOINTERFACE retourneert voor een bepaalde IID, mogen volgende aanroepen voor dezelfde IID op hetzelfde object nooit S_OK retourneren.

Het moet mogelijk zijn om query's uit te voeren voor elke interface op een object vanuit een andere interface

Dat wil gezegd, gezien de volgende code:

IA * pA = (some function returning an IA *); 
IB * pB = NULL; 
HRESULT   hr; 
hr = pA->QueryInterface(IID_IB, &pB); 
 

de volgende regels zijn van toepassing:

  • Als u een aanwijzer hebt naar een interface op een object, moet een aanroep als het volgende QueryInterface- voor diezelfde interface slagen:

    pA->QueryInterface(IID_IA, ...) 
    
    
  • Als een aanroep van QueryInterface voor een tweede interfacepointer slaagt, moet een aanroep naar QueryInterface vanaf die aanwijzer voor de eerste interface ook slagen. Als pB is verkregen, moet het volgende ook lukken:

    pB->QueryInterface(IID_IA, ...) 
    
    
  • Elke interface moet een query kunnen uitvoeren op elke andere interface op een object. Als pB is verkregen en u een query uitvoert voor een derde interface (IC) met behulp van die aanwijzer, moet u ook query's kunnen uitvoeren voor IC met behulp van de eerste aanwijzer, pA. In dit geval moet de volgende volgorde slagen:

    IC * pC = NULL; 
    hr = pB->QueryInterface(IID_IC, &pC); 
    pA->QueryInterface(IID_IC, ...) 
    
    

Interface-implementaties moeten een teller van openstaande verwijzingen naar verwijzingen naar alle interfaces op een bepaald object onderhouden. U moet een niet-ondertekend geheel getal voor de teller gebruiken.

Als een client moet weten dat resources zijn vrijgemaakt, moet deze een methode gebruiken in een bepaalde interface van het object met semantiek op een hoger niveau voordat IUnknown::Release.

IUnknown- gebruiken en implementeren