Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Existují tři hlavní pravidla, která řídí implementaci metody IUnknown::QueryInterface objektu COM:
- Objekty musí mít identitu.
- Sada rozhraní v instanci objektu musí být statická.
- Musí být možné úspěšně dotazovat na libovolné rozhraní objektu z jakéhokoli jiného rozhraní.
Objekty musí mít identitu.
U jakékoli instance objektu musí volání QueryInterface s IID_IUnknown vždy vrátit stejnou fyzickou hodnotu ukazatele. To vám umožní volat QueryInterface na libovolném dvou rozhraních a porovnat výsledky, abyste zjistili, zda odkazují na stejnou instanci objektu.
Sada rozhraní v instanci objektu musí být statická.
Sada rozhraní přístupná pro objekt prostřednictvím QueryInterface musí být statická, nikoli dynamická. Konkrétně pokud QueryInterface vrátí S_OK pro daný identifikátor IID jednou, nesmí nikdy vracet E_NOINTERFACE při následných voláních stejného objektu; a pokud QueryInterface vrátí E_NOINTERFACE pro daný identifikátor IID, následná volání stejného IDENTIFIKÁTORu IID na stejném objektu nesmí nikdy vrátit S_OK.
Musí být možné úspěšně zadat dotaz na jakékoli rozhraní objektu z jakéhokoli jiného rozhraní.
To znamená, že s následujícím kódem:
IA * pA = (some function returning an IA *);
IB * pB = NULL;
HRESULT hr;
hr = pA->QueryInterface(IID_IB, &pB);
platí následující pravidla:
Pokud máte ukazatel na rozhraní objektu, musí být úspěšné volání podobné následujícímu QueryInterface pro stejné rozhraní:
pA->QueryInterface(IID_IA, ...)Pokud volání QueryInterface druhého ukazatele rozhraní proběhne úspěšně, musí být úspěšné také volání QueryInterface z ukazatele prvního rozhraní. Pokud se pB úspěšně získal, musí být úspěšné také následující:
pB->QueryInterface(IID_IA, ...)Jakékoli rozhraní musí být schopné dotazovat na jakékoli jiné rozhraní objektu. Pokud byl pB úspěšně získán a úspěšně se dotazujete na třetí rozhraní (IC) pomocí daného ukazatele, musíte být také schopni úspěšně zadat dotaz na IC pomocí prvního ukazatele pA. V tomto případě musí být následující posloupnost úspěšná:
IC * pC = NULL; hr = pB->QueryInterface(IID_IC, &pC); pA->QueryInterface(IID_IC, ...)
Implementace rozhraní musí udržovat čítač nevyřízených odkazů ukazatele na všechna rozhraní daného objektu. Pro čítač byste měli použít celé číslo bez znaménka.
Pokud klient potřebuje vědět, že prostředky byly uvolněny, musí použít metodu v určitém rozhraní objektu s sémantikou vyšší úrovně před voláním IUnknown::Release.
Související témata
-
použití a implementace IUnknown