Aracılığıyla paylaş


QueryInterface: Obje İçinde Gezinti

Nesnedeki bir arabirime yönelik ilk işaretçiniz olduktan sonra, COM'un nesnenin başka bir belirli arabirimi destekleyip desteklemediğini bulmak ve destekliyorsa işaretçi almak için çok basit bir mekanizması vardır. (Nesnedeki bir arabirime ilk işaretçiyi alma hakkında bilgi için bkz. Nesneye İşaretçi Alma.) Bu mekanizma, IUnknown arabiriminin QueryInterface yöntemidir. Nesne istenen arabirimi destekliyorsa, yöntemin bu arabirime bir işaretçi döndürmesi gerekir. Bu, bir nesnenin desteklediği arabirimlerde serbestçe gezinmesine izin verir. QueryInterface, "Belirli bir sözleşmeyi destekliyor musunuz?" isteğini, görüşmeler başarılı olduktan sonra bu sözleşmenin yüksek performanslı kullanımından ayırır.

bir istemci başlangıçta bir nesneye erişim kazandığında, bu istemci en azından nesnenin kullanım ömrünü denetleyebileceği bir IUnknown arabirim işaretçisi (en temel arabirim) alır(nesnenin ne zaman kullanıldığı bildirilerek) ve QueryInterfaceçağırabilir. İstemci, yönettiği her nesneden bazı işlemler gerçekleştirmesini isteyecek şekilde programlanmıştır, ancak IUnknown arabiriminin bu işlemler için hiçbir işlevi yoktur. Bunun yerine, bu işlemler diğer arabirimler aracılığıyla ifade edilir. Bu nedenle istemci, bu arabirimler için nesnelerle anlaşmak üzere programlanmıştır. Özellikle, istemci QueryInterface çağırarak bir nesneden istemcinin istenen işlemleri çağırabileceği bir arabirim isteyecektir.

nesnesi QueryInterfaceuyguladığından, isteği kabul etme veya reddetme özelliğine sahiptir. Nesne istemcinin isteğini kabul ederse QueryInterface istenen arabirim için istemciye yeni bir işaretçi döndürür. Bu arabirim işaretçisi aracılığıyla, istemcinin bu arabirimin yöntemlerine erişimi vardır. Öte yandan nesne istemcinin isteğini reddederse QueryInterface null bir işaretçi (hata) döndürür ve istemcinin istenen işlevleri çağıracak bir işaretçisi yoktur. Bu durumda, istemcinin bu olasılıkla zarif bir şekilde ilgilenmesi gerekir. Örneğin, bir istemcinin bir nesnede A arabirimine yönelik bir işaretçisi olduğunu ve B ve C arabirimlerini istediğini varsayalım. Nesnenin B arabirimini desteklediğini ancak C arabirimini desteklemediğini de varsayalım. Sonuç, nesnenin B'ye bir işaretçi döndürmesi ve C'nin desteklenmediğini bildirmesidir.

Önemli bir nokta, bir nesne queryinterfaceçağrısını reddettiği zaman istemcinin nesneden istenen arabirim aracılığıyla ifade edilen işlemleri gerçekleştirmesini istemesinin mümkün olmadığını gösterir. bir istemcinin, bu arabirimdeki yöntemleri çağırmak için bir arabirim işaretçisine sahip olması gerekir. İstenen işaretçiyi sağlamayı nesne reddederse, istemcinin bu nesneyle yapmak istediği şeylerden vazgeçerek ya da başka bir, belki de daha az güçlü bir arabirime dönmeye çalışarak ona ihtiyaç duymamaya hazır olması gerekir. COM işlevinin bu özelliği, siz bu işlevi çağırana kadar bir işlevin çalışıp çalışmayacağını bilmediğiniz diğer nesne odaklı sistemlerle karşılaştırıldığında iyi çalışır ve bu durumda bile işleme hatası belirsizdir. QueryInterface, bir nesnenin yöntemlerini çağırmaya çalışmadan önce bir arabirimi destekleyip desteklemediğini bilmek için güvenilir ve tutarlı bir yol sağlar.

QueryInterface yöntemi, bir nesnenin belirli bir sözleşmeyi desteklemediğini belirtmesi için sağlam ve güvenilir bir yol da sağlar. Bir QueryInterface çağrısında biri "eski" bir nesneye "yeni" bir arabirimi destekleyip desteklemediğini sorarsa (örneğin, bu arabirim eski nesne gönderildikten sonra ortaya çıktıysa), eski nesne, herhangi bir kilitlenmeye neden olmadan güvenilir bir şekilde "hayır" yanıtı verecektir. Bu güvenilir yanıtı sağlayan teknoloji, IID'lerin tahsis edildiği algoritmadır. Bu küçük bir nokta gibi görünse de, sistemin genel mimarisi için son derece önemlidir ve yeni işlevler hakkında eski öğeleri sorgulama özelliği, şaşırtıcı bir şekilde diğer nesne mimarilerinin çoğunda bulunmayan bir özelliktir.

IUnknown Kullanma ve Uygulama