Megosztás a következőn keresztül:


A QueryInterface implementálásának szabályai

Három fő szabály szabályozza az IUnknown::QueryInterface metódus implementálását egy COM-objektumon:

  • Az objektumoknak identitással kell rendelkezniük.
  • Az objektumpéldányok illesztőinek statikusnak kell lenniük.
  • Egy objektum bármely illesztőjén sikeresen lekérdezhetőnek kell lennie bármely más felületről.

Az objektumoknak identitással kell rendelkezniük

Bármely adott objektumpéldány esetében a QueryInterfaceIID_IUnknown hívásának mindig ugyanazt a fizikai mutatóértéket kell visszaadnia. Ez lehetővé teszi QueryInterface meghívását bármely két felületen, és összehasonlíthatja az eredményeket annak megállapításához, hogy egy objektum ugyanazon példányára mutatnak-e.

Az objektumpéldányok illesztőinek statikusnak kell lenniük

Az objektumon QueryInterface keresztül elérhető illesztőknek statikusnak, nem dinamikusnak kell lenniük. Pontosabban, ha QueryInterface egyszer ad vissza S_OK egy adott IID-hez, soha nem szabad E_NOINTERFACE visszaadnia ugyanazon objektum későbbi hívásai esetén; és ha QueryInterface egy adott IID-E_NOINTERFACE ad vissza, az ugyanazon objektumon lévő ugyanazon IID későbbi hívásai soha nem térnek vissza S_OK.

Egy objektum bármely más felületéről történő lekérdezésének sikeresnek kell lennie

Vagyis a következő kóddal:

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

a következő szabályok vonatkoznak:

  • Ha egy objektumon egy illesztőre mutató mutató van, a QueryInterfaceaz alábbihoz hasonló hívásnak sikeresnek kell lennie:

    pA->QueryInterface(IID_IA, ...) 
    
    
  • Ha egy második illesztőmutató QueryInterface hívása sikeres, a QueryInterface hívásának is sikeresnek kell lennie. Ha a pB-t sikeresen beszerezték, az alábbiaknak is sikeresnek kell lenniük:

    pB->QueryInterface(IID_IA, ...) 
    
    
  • Minden illesztőnek képesnek kell lennie az objektum bármely más felületének lekérdezésére. Ha a pB-t sikeresen beszerezte, és ezzel a mutatóval sikeresen lekérdezett egy harmadik interfészt (IC), akkor az első pA mutatóval is sikeresen le kell tudnia kérdezni az IC-t. Ebben az esetben a következő sorozatnak sikeresnek kell lennie:

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

Az illesztő-implementációknak az adott objektum összes adapterére mutató kiemelkedő mutatóhivatkozások számlálóját kell fenntartaniuk. A számlálóhoz nem aláírt egész kell használnia.

Ha az ügyfélnek tudnia kell, hogy az erőforrások felszabadítva lettek, az objektum bizonyos felületén egy magasabb szintű szemantikával rendelkező metódust kell használnia, mielőtt meghívja IUnknown::Release.

IUnknown használata és implementálása