Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Miután egy objektum egy felületére mutató kezdeti mutatót kapott, a COM egy nagyon egyszerű mechanizmussal rendelkezik annak megállapítására, hogy az objektum támogatja-e egy másik adott felületet, és ha igen, mutatót szeretne kapni hozzá. (Az objektum egy felületére mutató kezdeti mutatóval kapcsolatos információkért lásd: Mutató lekérése objektumhoz.) Ez a mechanizmus az IUnknown interfész QueryInterface metódusa. Ha az objektum támogatja a kért felületet, a metódusnak vissza kell adnia egy mutatót az adott felületre. Ez lehetővé teszi, hogy egy objektum szabadon navigáljon az objektumok által támogatott felületeken. QueryInterface választja el a "Támogat egy adott szerződést?" kérést a szerződés nagy teljesítményű használatától, miután a tárgyalások sikeresek lettek.
Amikor egy ügyfél kezdetben hozzáférést kap egy objektumhoz, az ügyfél legalább egy IUnknown felületmutatót (a legalapvetőbb felületet) kap, amelyen keresztül szabályozhatja az objektum élettartamát – az objektumnak az objektum használatával végzett állapotának elmondásával –, és meghívja QueryInterface. Az ügyfél úgy van beprogramozva, hogy minden általa kezelt objektumot megkérjen bizonyos műveletek végrehajtására, de az IUnknown interfész nem rendelkezik függvényekkel ezekhez a műveletekhez. Ehelyett ezeket a műveleteket más felületeken fejezik ki. Az ügyfél így úgy van beprogramozva, hogy az adott interfészek objektumaival tárgyaljon. Pontosabban az ügyfél meghívja QueryInterface, hogy egy objektumot kérjen egy interfészhez, amelyen keresztül az ügyfél meghívhatja a kívánt műveleteket.
Mivel az objektum QueryInterfaceimplementál, képes elfogadni vagy elutasítani a kérést. Ha az objektum elfogadja az ügyfél kérését, QueryInterface egy új mutatót ad vissza az ügyfélnek a kért felületre. Ezen az interfészmutatón keresztül az ügyfél hozzáfér az adott felület metódusaihoz. Ha viszont az objektum elutasítja az ügyfél kérését, QueryInterface null mutatót ad vissza – hibaüzenetet –, és az ügyfélnek nincs mutatója, amelyen keresztül meghívhatja a kívánt függvényeket. Ebben az esetben az ügyfélnek kecsesen kell kezelnie ezt a lehetőséget. Tegyük fel például, hogy egy ügyfél rendelkezik egy mutatóval az A interfészhez egy objektumon, és B és C interfészeket kér. Tegyük fel azt is, hogy az objektum támogatja a B felületet, de nem támogatja a C interfészt. Az eredmény az, hogy az objektum egy B mutatót ad vissza, és azt jelenti, hogy a C nem támogatott.
A lényeg az, hogy amikor egy objektum elutasítja QueryInterfacehívását, az ügyfél nem kérheti meg az objektumot a kért felületen kifejezett műveletek végrehajtására. Az ügyfélnek rendelkeznie kell egy felületmutatóval a metódusok meghívásához az adott felületen. Ha az objektum nem hajlandó megadni a kért mutatót, az ügyfélnek készülnie kell arra, hogy nélküle boldoguljon—akár úgy, hogy eltekint attól, amit az objektummal tervezett tenni, akár megpróbál egy másik, esetleg kevésbé erős felületre támaszkodni. A COM-funkciók ezen funkciója jól működik más objektumorientált rendszerekkel összehasonlítva, amelyekben nem lehet tudni, hogy egy függvény működni fog-e, amíg meg nem hívja a függvényt, és még akkor is bizonytalan a hiba kezelése. QueryInterface megbízható és konzisztens módot biztosít annak megállapítására, hogy egy objektum támogatja-e a felületet a metódusok meghívása előtt.
A QueryInterface metódus robusztus és megbízható módot biztosít az objektumok számára, hogy jelezzék, hogy nem támogat egy adott szerződést. Ez azt jelzi, hogy ha a QueryInterface hívásában megkérdezünk egy "régi" objektumot, hogy támogatja-e az "új" felületet (például azt, amit a régi objektum kiszállítása után találták fel), a régi objektum megbízhatóan, összeomlás nélkül válaszol a "nem" válaszra. Az ezt támogató technológia az az algoritmus, amellyel az IID-k ki vannak foglalva. Bár ez egy kis pontnak tűnhet, rendkívül fontos a rendszer általános architektúrája szempontjából, és meglepő módon a legtöbb más objektumarchitektúrában nem jelenik meg az örökölt elemek megkeresése az új funkciókkal kapcsolatban.
Kapcsolódó témakörök
-
IUnknown használata és implementálása