Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
COM nesnesinde IUnknown::QueryInterface yöntemini uygulamayı yöneten üç ana kural vardır:
- Nesnelerin kimliği olmalıdır.
- Bir nesne örneğindeki arabirim kümesi statik olmalıdır.
- Bir nesnedeki herhangi bir arabirim için başka bir arabirimden başarıyla sorgulanması mümkün olmalıdır.
Nesnelerin Kimliği Olmalıdır
Belirli bir nesne örneği için, IID_IUnknown ile QueryInterfaceçağrısı her zaman aynı fiziksel işaretçi değerini döndürmelidir. Bu, iki arabirimde QueryInterface çağırmanıza ve sonuçları karşılaştırarak bir nesnenin aynı örneğine işaret edip etmediklerini belirlemenize olanak tanır.
Nesne Örneğindeki Arabirim Kümesi Statik Olmalıdır
QueryInterface aracılığıyla bir nesne üzerinde erişilebilen arabirim kümesi dinamik değil statik olmalıdır. Özellikle, QueryInterface belirli bir IID için S_OK bir kez döndürürse, aynı nesnedeki sonraki çağrılarda E_NOINTERFACE asla döndürmemelidir; ve QueryInterface belirli bir IID için E_NOINTERFACE döndürürse, aynı nesnede aynı IID için yapılan sonraki çağrılar hiçbir zaman S_OK döndürmemelidir.
Nesnedeki Herhangi Bir Arabirim için Başka Bir Arabirimden Başarıyla Sorgulanması Mümkün Olmalıdır
Yani, aşağıdaki koda göre:
IA * pA = (some function returning an IA *);
IB * pB = NULL;
HRESULT hr;
hr = pA->QueryInterface(IID_IB, &pB);
aşağıdaki kurallar geçerlidir:
Bir nesnedeki arabirimin işaretçisi varsa, aynı arabirim için QueryInterfaceiçin aşağıdakine benzer bir çağrının başarılı olması gerekir:
pA->QueryInterface(IID_IA, ...)İkinci arabirim işaretçisi için QueryInterfaceçağrısı başarılı olursa, ilk arabirim için bu işaretçiden queryinterface çağrısı da başarılı olmalıdır. pB başarıyla elde edildiyse, aşağıdakiler de başarılı olmalıdır:
pB->QueryInterface(IID_IA, ...)Herhangi bir arabirimin nesnedeki diğer arabirimleri sorgulayabilmesi gerekir. pB başarıyla elde edildiyse ve bu işaretçiyi kullanarak üçüncü bir arabirimi (IC) başarıyla sorgularsanız, ilk işaretçi olan pA'yı kullanarak IC için de başarıyla sorgulayabilmeniz gerekir. Bu durumda, aşağıdaki sıra başarılı olmalıdır:
IC * pC = NULL; hr = pB->QueryInterface(IID_IC, &pC); pA->QueryInterface(IID_IC, ...)
Arabirim uygulamaları, belirli bir nesnedeki tüm arabirimlere bekleyen işaretçi başvurularının sayacını tutmalıdır. Sayaç için işaretsiz tamsayı kullanmanız gerekir.
İstemcinin kaynakların serbest bırakıldığını bilmesi gerekiyorsa, IUnknown::Releaseçağırmadan önce nesnedeki daha üst düzey semantiklere sahip bir arabirimde bir yöntem kullanmalıdır.
İlgili konular
-
IUnknown Kullanma ve Uygulama