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.
Bu konuda Hata Ayıklayıcı C++ Veri Modeli içindeki kavramlar açıklanmaktadır.
Veri Modelindeki Kavramlar
Veri modelindeki yapay nesneler etkili bir şekilde iki öğedir:
- Anahtar/değer/meta veri çiftleri sözlüğü.
- Veri modeli tarafından desteklenen kavramlar (arabirimler) kümesi. Kavramlar, bir istemcinin (veri modelinin aksine) belirli bir anlamsal davranış kümesi sağlamak için uyguladığı arabirimlerdir. Şu anda desteklenen kavram kümesi burada listelenmiştir.
| Kavram Arayüzü | Açıklama |
|---|---|
| IDataModelConcept | Kavram bir ana modeldir. Bu model kayıtlı bir tür imzası aracılığıyla yerel bir türe otomatik olarak eklenirse, InitializeObject yöntemi bu türdeki yeni bir nesnenin örneği her başlatıldığında otomatik olarak çağrılır. |
| IStringDisplayableConcept (Dize Olarak Görüntülenebilir Kavram) | Nesne, görüntüleme amacıyla bir dizeye dönüştürülebilir. |
| IIterableConcept | Nesne bir kapsayıcıdır ve üzerinde yineleme yapılabilir. |
| IIndexableConcept | Nesnesi bir kapsayıcıdır ve bir veya daha fazla boyutta dizinlenebilir (rastgele erişim yoluyla erişilebilir). |
| TercîhEdilenÇalışmaZamanıTürüKavramı | Nesne, alttaki tür sisteminin sağlayabileceğinden daha fazla türetilen türler hakkında anlaşıyor ve statikten çalışma zamanı türüne kendi dönüştürmelerini işlemek istiyor. |
| IDynamicKeyProviderConcept | nesnesi dinamik bir anahtar sağlayıcısıdır ve çekirdek veri modelinden tüm anahtar sorgularını devralmak ister. Bu arabirim genellikle JavaScript gibi dinamik dillere köprü olarak kullanılır. |
| IDynamicConceptProviderConcept | nesnesi dinamik bir kavram sağlayıcısıdır ve tüm kavram sorgularını çekirdek veri modelinden devralmak ister. Bu arabirim genellikle JavaScript gibi dinamik dillere köprü olarak kullanılır. |
Veri Modeli Kavramı: IDataModelConcept
Başka bir model nesnesine üst model olarak eklenmiş olan tüm model nesneleri veri modeli kavramını doğrudan desteklemelidir. Veri modeli kavramı, aşağıdaki gibi tanımlanan IDataModelConcept arabiriminin desteklenmesine ihtiyaç duyar.
DECLARE_INTERFACE_(IDataModelConcept, IUnknown)
{
STDMETHOD(InitializeObject)(_In_ IModelObject* modelObject, _In_opt_ IDebugHostTypeSignature* matchingTypeSignature, _In_opt_ IDebugHostSymbolEnumerator* wildcardMatches) PURE;
STDMETHOD(GetName)(_Out_ BSTR* modelName) PURE;
}
Veri modeli, kurallı görselleştirici olarak veya veri modeli yöneticisinin RegisterModelForTypeSignature veya RegisterExtensionForTypeSignature yöntemleri aracılığıyla belirli bir yerel türün uzantısı olarak kaydedilebilir. Bir model bu yöntemlerden biri aracılığıyla kaydedildiğinde, veri modeli türü kayıtta geçirilen imzayla eşleşen herhangi bir yerel nesneye otomatik olarak üst model olarak eklenir. Ekin otomatik olarak yapıldığı noktada, veri modelinde InitializeObject yöntemi çağrılır. Örnek nesnesi, eke neden olan tür imzası ve tür imzasında joker karakterlerle eşleşen tür örneklerini (doğrusal sırada) üreten bir numaralandırıcı geçirilir. Veri modeli uygulaması, gerekli tüm önbellekleri başlatmak için bu yöntem çağrısını kullanabilir.
Belirli bir veri modeli RegisterNamedModel yöntemi aracılığıyla varsayılan bir ad altında kayıtlıysa, kayıtlı veri modelinin IDataModelConcept arabirimi bu yöntemden bu adı döndürmelidir. Bir modelin birden çok adla kaydedilmesinin son derece meşru olduğunu unutmayın (varsayılan veya en iyisi burada döndürülmelidir). Model tamamen adlandırılmamış olabilir (bir adla kaydedilmediği sürece). Böyle durumlarda GetName yöntemi E_NOTIMPL döndürmelidir.
Metin Görüntülenebilir Kavramı: IStringDisplayableConcept
Görüntüleme amacıyla bir dize dönüştürmesi sağlamak isteyen bir nesne, IStringDisplayableConcept arabiriminin uygulanması aracılığıyla dize görüntülenebilir kavramını uygulayabilir. Arabirim aşağıdaki gibi tanımlanır:
DECLARE_INTERFACE_(IStringDisplayableConcept, IUnknown)
{
STDMETHOD(ToDisplayString)(_In_ IModelObject* contextObject, _In_opt_ IKeyStore* metadata, _Out_ BSTR* displayString) PURE;
}
ToDisplayString yöntemi, bir istemci bir nesneyi görüntülenecek bir dizeye dönüştürmek istediğinde (konsola, kullanıcı arabiriminde vb.) çağrılır. Böyle bir dize dönüştürme ek programlı işleme temeli için kullanılmamalıdır. Dize dönüştürme işlemi, çağrıya iletilen meta veriler tarafından derinden etkilenebilir. Dize dönüştürme, PreferredRadix ve PreferredFormat anahtarlarını yerine getirmek için elinden geleni yapmalıdır.
Yinelenebilir Kavram: IIterableConcept ve IModelIterator
Diğer nesnelerin kapsayıcısı olan ve bu kapsanan nesneler üzerinde yineleme yeteneğini ifade etmek isteyen bir nesne, IIterableConcept ve IModelIterator arabirimlerinin uygulanmasıyla yinelenebilir kavramı destekleyebilir. Yinelenebilir kavramın desteği ile dizinlenebilir kavramın desteği arasında çok önemli bir ilişki vardır. İçerilen nesnelere rastgele erişimi destekleyen bir nesne, yinelenebilir kavramın yanı sıra dizinlenebilir kavramı da destekleyebilir. Bu durumda, yinelenen öğeler, dizinlenebilir kavrama geçirildiğinde aynı nesneye başvuran bir varsayılan dizin de üretmelidir. Bu değişmez koşulun sağlanamaması, hata ayıklama ortamında tanımsız davranışa yol açacaktır.
IIterableConcept aşağıdaki gibi tanımlanır:
DECLARE_INTERFACE_(IIterableConcept, IUnknown)
{
STDMETHOD(GetDefaultIndexDimensionality)(_In_ IModelObject* contextObject, _Out_ ULONG64* dimensionality) PURE;
STDMETHOD(GetIterator)(_In_ IModelObject* contextObject, _Out_ IModelIterator** iterator) PURE;
}
IModelIterator Kavramı aşağıdaki gibi tanımlanır:
DECLARE_INTERFACE_(IModelIterator, IUnknown)
{
STDMETHOD(Reset)() PURE;
STDMETHOD(GetNext)(_COM_Errorptr_ IModelObject** object, _In_ ULONG64 dimensions, _Out_writes_opt_(dimensions) IModelObject** indexers, _COM_Outptr_opt_result_maybenull_ IKeyStore** metadata) PURE;
}
IIterableConcept'e ait GetDefaultIndexDimensionality
GetDefaultIndexDimensionality yöntemi, varsayılan dizine boyut sayısını döndürür. Bir nesne dizine eklenemezse, bu yöntem 0 döndürmelidir ve başarılı olmalıdır (S_OK). Bu yöntemden sıfır olmayan bir değer döndüren herhangi bir nesne, şunu belirten bir protokol sözleşmesi için destek bildiriyor:
- nesnesi, IIndexableConcept desteği aracılığıyla dizinlenebilir kavramı destekler
- Yinelenebilir kavramın GetIterator yönteminden döndürülen IModelIterator'ın GetNext yöntemi, üretilen her öğe için benzersiz bir varsayılan dizin döndürür. Bu tür dizin, burada gösterildiği gibi boyut sayısına sahip olacaktır.
- IModelIterator'ın GetNext yönteminden döndürülen dizinleri dizinlenebilir kavramdaki GetAt yöntemine (IIndexableConcept) geçirmek, GetNext'in ürettiği nesneye başvurur. Aynı değer döndürülür.
IIterableConcept'ın GetIterator'ı
Yinelenebilir kavramdaki GetIterator yöntemi, nesneyi yinelemek için kullanılabilecek bir yineleyici arabirimi döndürür. Döndürülen yineleyici, GetIterator yöntemine geçirilen bağlam nesnesini anımsamalıdır. Yineleyicinin kendisindeki yöntemlere aktarılmayacaktır.
IModelIterator'ın Sıfırlaması
Yinelenebilir kavramdan döndürülen bir yineleyicideki Reset yöntemi, yineleyicinin konumunu yineleyici ilk oluşturulduğunda olduğu konuma (ilk öğeden önce) geri yükler. Yineleyicinin Reset yöntemini desteklemesi kesinlikle önerilir, ancak gerekli değildir. Yineleyici, C++ giriş yineleyicisinin eşdeğeri olabilir ve yalnızca tek bir iletme yinelemesine izin verir. Böyle bir durumda Reset yöntemi E_NOTIMPL ile başarısız olabilir.
IModelIterator'ın GetNext'i
GetNext yöntemi yineleyiciyi ileri taşır ve sonraki yinelenmiş öğeyi getirir. Nesne yinelenebilir olmasına ek olarak dizinlenebilirse ve sıfır olmayan bir değer döndüren GetDefaultIndexDimensionality bağımsız değişkeni tarafından belirtilirse, bu yöntem isteğe bağlı olarak dizin oluşturucudan üretilen değere geri dönmek için varsayılan dizinleri döndürebilir. Çağıranın 0/nullptr geçirmeyi seçebileceğini ve dizin almayabileceğini unutmayın. Çağıranın kısmi dizinler istemesi geçersiz kabul edilir (örneğin: GetDefaultIndexDimensionality tarafından üretilen numaradan daha az).
Yineleyici başarılı bir şekilde ilerlediyse ancak yinelendi öğesinin değerini okurken bir hata oluştuysa, yöntem hata döndürebilir VE "nesneyi" bir hata nesnesiyle doldurabilir. İçerilen öğelerin yinelenmesinin sonunda yineleyici GetNext yönteminden E_BOUNDS döndürür. Sonraki tüm çağrılar (araya bir Sıfırlama çağrısı yapılmadığı sürece) E_BOUNDS döndürür.
Dizinlenebilir Kavram: IIndexableConcept
bir içindekiler kümesine rastgele erişim sağlamak isteyen bir nesne, IIndexableConcept arabirimi desteği aracılığıyla dizinlenebilir kavramı destekleyebilir. Dizine alınabilen nesnelerin çoğu, yinelenebilir kavramın desteğiyle de yinelenebilir olacaktır. Ancak bu gerekli değildir. Destekleniyorsa, yineleyici ile dizin oluşturucu arasında önemli bir ilişki vardır. Yineleyicinin GetDefaultIndexDimensionality'yi desteklemesi, bu yöntemden sıfır olmayan bir değer döndürmesi ve burada belgelenen sözleşmeyi desteklemesi gerekir. Dizin oluşturucu kavram arabirimi aşağıdaki gibi tanımlanır:
DECLARE_INTERFACE_(IIndexableConcept, IUnknown)
{
STDMETHOD(GetDimensionality)(_In_ IModelObject* contextObject, _Out_ ULONG64* dimensionality) PURE;
STDMETHOD(GetAt)(_In_ IModelObject* contextObject, _In_ ULONG64 indexerCount, _In_reads_(indexerCount) IModelObject** indexers, _COM_Errorptr_ IModelObject** object, _COM_Outptr_opt_result_maybenull_ IKeyStore** metadata) PURE;
STDMETHOD(SetAt)(_In_ IModelObject* contextObject, _In_ ULONG64 indexerCount, _In_reads_(indexerCount) IModelObject** indexers, _In_ IModelObject *value) PURE;
}
Dizin oluşturucuyu (ve yineleyici ile etkileşimini) kullanma örneği aşağıda gösterilmiştir. Bu örnek, dizine alınabilen bir kapsayıcının içeriğini yineler ve dizin oluşturucuyu kullanarak yeni döndürülen değere geri döner. Bu işlem yazıldıkçe işlevsel olarak işe yaramaz olsa da, bu arabirimlerin nasıl etkileşime geçtiğini gösterir. Aşağıdaki örnekte bellek ayırma hatasıyla ilgilenmediğini unutmayın. "Yeni bir hatanın fırlatılmasını varsayar (kodun bulunduğu ortama bağlı olarak kötü bir varsayım olabilir -- veri modelinin COM yöntemleri, C++ istisnalarının dışarı çıkmasına izin vermez):"
ComPtr<IModelObject> spObject;
//
// Assume we have gotten some object in spObject that is iterable (e.g.: an object which represents a std::vector<SOMESTRUCT>)
//
ComPtr<IIterableConcept> spIterable;
ComPtr<IIndexableConcept> spIndexer;
if (SUCCEEDED(spObject->GetConcept(__uuidof(IIterableConcept), &spIterable, nullptr)) &&
SUCCEEDED(spObject->GetConcept(__uuidof(IIndexableConcept), &spIndexable, nullptr)))
{
ComPtr<IModelIterator> spIterator;
//
// Determine how many dimensions the default indexer is and allocate the requisite buffer.
//
ULONG64 dimensions;
if (SUCCEEDED(spIterable->GetDefaultIndexDimensionality(spObject.Get(), &dimensions)) && dimensions > 0 &&
SUCCEEDED(spIterable->GetIterator(spObject.Get(), &spIterator)))
{
std::unique_ptr<ComPtr<IModelObject>[]> spIndexers(new ComPtr<IModelObject>[dimensions]);
//
// We have an iterator. Error codes have semantic meaning here. E_BOUNDS indicates the end of iteration. E_ABORT indicates that
// the debugger host or application is trying to abort whatever operation is occurring. Anything else indicates
// some other error (e.g.: memory read failure) where the iterator MIGHT still produce values.
//
for(;;)
{
ComPtr<IModelObject> spContainedStruct;
ComPtr<IKeyStore> spContainedMetadata;
//
// When we fetch the value from the iterator, it will pass back the default indices.
//
HRESULT hr = spIterable->GetNext(&spContainedStruct, dimensions, reinterpret_cast<IModelObject **>(spIndexers.get()), &spContainedMetadata);
if (hr == E_BOUNDS || hr == E_ABORT)
{
break;
}
if (FAILED(hr))
{
//
// Decide how to deal with failure to fetch an element. Note that spContainedStruct *MAY* contain an error object
// which has detailed information about why the failure occurred (e.g.: failure to read memory at address X).
//
}
//
// Use the indexer to get back to the same value. We already have them, so there isn't much functional point to this. It simply
// highlights the interplay between iterator and indexer.
//
ComPtr<IModelObject> spIndexedStruct;
ComPtr<IKeyStore> spIndexedMetadata;
if (SUCCEEDED(spIndexer->GetAt(spObject.Get(), dimensions, reinterpret_cast<IModelObject **>(spIndexers.get()), &spIndexedStruct, &spIndexedMetadata)))
{
//
// spContainedStruct and spIndexedStruct refer to the same object. They may not have interface equality.
// spContainedMetadata and spIndexedMetadata refer to the same metadata store with the same contents. They may not have interface equality.
//
}
}
}
}
GetDimensionality yöntemi, nesnenin dizine eklendiği boyut sayısını döndürür. Nesne hem yinelenebilir hem de dizinlenebilirse GetDefaultIndexDimensionality uygulamasının, dizin oluşturucunun sahip olduğu boyut sayısı konusunda GetDimensionality uygulamasını kabul etmesi gerektiğini unutmayın.
GetAt yöntemi, belirli bir N boyutlu dizindeki değeri dizine alınan nesnenin içinden alır. N boyutlu bir dizin oluşturucu, burada N, GetDimensionality'den döndürülen değerdir desteklenmelidir. Bir nesnenin farklı etki alanlarında farklı türlere göre (örn. hem sıralar hem de dizeler aracılığıyla dizinlenebilir) dizine alınabileceğini unutmayın. Dizin aralık dışındaysa (veya erişilemediyse), yöntem bir hata döndürür; ancak bu gibi durumlarda çıkış nesnesi yine de bir hata nesnesine ayarlanmış olabilir.
SetAt yöntemi, dizine alınan nesnenin içinden belirli bir N boyutlu dizindeki değeri ayarlamayı dener. N boyutlu bir dizin oluşturucu, burada N, GetDimensionality'den döndürülen değerdir desteklenmelidir. Bir nesnenin farklı etki alanlarında farklı türlere göre (örn. hem sıralar hem de dizeler aracılığıyla dizinlenebilir) dizine alınabileceğini unutmayın. Bazı indeksleyiciler salt okunur. Böyle durumlarda, SetAt yöntemine yapılan herhangi bir çağrıdan E_NOTIMPL döndürülür.
Tercih Edilen Çalışma Zamanı Türü Kavramı: IPreferredRuntimeTypeConcept
Bir debug ana bilgisayarı, sembolik bilgilerde yer alan statik bir türden bir nesnenin gerçek çalışma zamanı türünü belirlemek için sorgulanabilir. Bu dönüştürme tamamen doğru bilgilere (ör. C++ RTTI) dayalı olabilir veya nesne içindeki herhangi bir sanal işlev tablosunun şekli gibi güçlü buluşsal yöntemlere dayalı olabilir. Ancak bazı nesneler, hata ayıklama ana bilgisayarının buluşsal yöntemlerine sığmadığından statikten çalışma zamanı türüne dönüştürülemez (örn. RTTI veya sanal işlev tabloları yoktur). Böyle durumlarda, bir nesnenin veri modeli varsayılan davranışı geçersiz kılmayı seçebilir ve hata ayıklama ana bilgisayarının anlayabildiğinden daha fazla nesnenin "çalışma zamanı türü" hakkında daha fazla bilgi sahibi olduğunu bildirebilir. Bu, tercih edilen çalışma zamanı türü kavramı ve IPreferredRuntimeTypeConcept arabirimi desteği aracılığıyla yapılır.
IPreferredRuntimeTypeConcept arabirimi aşağıdaki gibi bildirilir:
DECLARE_INTERFACE_(IPreferredRuntimeTypeConcept, IUnknown)
{
STDMETHOD(CastToPreferredRuntimeType)(_In_ IModelObject* contextObject, _COM_Errorptr_ IModelObject** object) PURE;
}
CastToPreferredRuntimeType yöntemi, bir istemci statik tür örneğinden bu örneğin çalışma zamanı tipine dönüştürmeyi denemek istediğinde çağrılır. Söz konusu nesne tercih edilen çalışma zamanı türü kavramını destekliyorsa (ekli üst modellerinden biri aracılığıyla) dönüştürmeyi gerçekleştirmek için bu yöntem çağrılır. Bu yöntem özgün nesneyi döndürebilir (dönüştürme yok veya çözümlenemedi), çalışma zamanı türünün yeni bir örneğini döndürebilir, anlam dışı nedenlerle başarısız olabilir (örneğin: bellek yetersiz) veya E_NOT_SET döndürebilir. E_NOT_SET hata kodu, veri modeline uygulamanın varsayılan davranışı geçersiz kılmak istemediğini ve veri modelinin hata ayıklama konağı tarafından gerçekleştirilen analize geri dönmesi gerektiğini belirten çok özel bir hata kodudur (örneğin: RTTI analizi, sanal işlev tablolarının şeklinin incelenmesi, vb...)
Dinamik Sağlayıcı Kavramları: IDynamicKeyProviderConcept ve IDynamicConceptProviderConcept
Veri modelinin kendisi normalde nesneler için anahtar ve kavram yönetimini işlerken, bu kavramın idealden daha az olduğu zamanlar vardır. Özellikle, bir istemci veri modeli ile gerçekten dinamik olan başka bir şey (örneğin JavaScript) arasında bir köprü oluşturmak istediğinde, veri modelindeki uygulamadan anahtar ve kavram yönetimini devralmak değerli olabilir. Çekirdek veri modeli IModelObject'in tek ve tek uygulaması olduğundan, bunun yerine iki kavramın birleşimiyle yapılır: dinamik anahtar sağlayıcısı kavramı ve dinamik kavram sağlayıcısı kavramı. Her ikisini de uygulamak normal olsa da, böyle bir gereksinim yoktur.
Her ikisi de uygulanırsa, dinamik kavram sağlayıcısı kavramından önce dinamik anahtar sağlayıcı kavramı eklenmelidir. Bu kavramların her ikisi de özeldir. Bir nesnenin ayarını etkin bir şekilde değiştirerek, onu "statik olarak yönetilen" konumdan "dinamik olarak yönetilen" konuma getirirler. Bu kavramlar, nesne üzerinde veri modeli tarafından yönetilen herhangi bir anahtar veya kavram olmadığında ayarlanabilir. Bu kavramlar bir nesneye eklendikten sonra, bunu yapma eylemi geri alınamaz.
Dinamik kavram sağlayıcısı olan ve olmayan bir IModelObject arasında genişletilebilirlik ile ilgili ek bir semantik fark vardır. Bu kavramlar, istemcilerin veri modeli ile JavaScript gibi dinamik dil sistemleri arasında köprüler oluşturmasına olanak sağlamak için tasarlanmıştır. Veri modeli, JavaScript prototip zinciri gibi doğrusal bir zincir yerine üst model ağacı olması bakımından Temel olarak JavaScript gibi sistemlerden farklı bir genişletilebilirlik kavramına sahiptir. Bu tür sistemlerle daha iyi bir ilişki sağlamak için dinamik kavram sağlayıcısı olan bir IModelObject'in tek bir veri modeli üst öğesi vardır. Bu tek veri modeli üst öğesi, veri modeli için tipik olduğu gibi rastgele sayıda üst modele sahip olabilecek normal bir IModelObject'tir. Dinamik kavram sağlayıcısına yapılan üst öğe ekleme veya kaldırma istekleri otomatik olarak tek bir üst öğeye yönlendirilir. Dışarıdan bakıldığında, dinamik kavram sağlayıcısının üst modellerden oluşan normal bir ağaç stili zinciri var gibi görünüyor. Dinamik kavram sağlayıcısı kavramının uygulayıcısı, ara tek üst öğeyi bilen tek nesnedir (çekirdek veri modelinin dışında). Bu tek ebeveyn, bir köprü sağlamak için dinamik dil sistemine bağlanabilir (örneğin: JavaScript prototip zincirine dahil edilebilir).
Dinamik anahtar sağlayıcısı kavramı aşağıdaki gibi tanımlanır:
DECLARE_INTERFACE_(IDynamicKeyProviderConcept, IUnknown)
{
STDMETHOD(GetKey)(_In_ IModelObject *contextObject, _In_ PCWSTR key, _COM_Outptr_opt_result_maybenull_ IModelObject** keyValue, _COM_Outptr_opt_result_maybenull_ IKeyStore** metadata, _Out_opt_ bool *hasKey) PURE;
STDMETHOD(SetKey)(_In_ IModelObject *contextObject, _In_ PCWSTR key, _In_ IModelObject *keyValue, _In_ IKeyStore *metadata) PURE;
STDMETHOD(EnumerateKeys)(_In_ IModelObject *contextObject, _COM_Outptr_ IKeyEnumerator **ppEnumerator) PURE;
}
Dinamik kavram sağlayıcısı kavramı aşağıdaki gibi tanımlanır:
DECLARE_INTERFACE_(IDynamicConceptProviderConcept, IUnknown)
{
STDMETHOD(GetConcept)(_In_ IModelObject *contextObject, _In_ REFIID conceptId, _COM_Outptr_result_maybenull_ IUnknown **conceptInterface, _COM_Outptr_opt_result_maybenull_ IKeyStore **conceptMetadata, _Out_ bool *hasConcept) PURE;
STDMETHOD(SetConcept)(_In_ IModelObject *contextObject, _In_ REFIID conceptId, _In_ IUnknown *conceptInterface, _In_opt_ IKeyStore *conceptMetadata) PURE;
STDMETHOD(NotifyParent)(_In_ IModelObject *parentModel) PURE;
STDMETHOD(NotifyParentChange)(_In_ IModelObject *parentModel) PURE;
STDMETHOD(NotifyDestruct)() PURE;
}
IDynamicKeyProviderConcept'un GetKey
Dinamik anahtar sağlayıcısındaki GetKey yöntemi, büyük ölçüde IModelObject üzerindeki GetKey yönteminin geçersiz kılma işlemidir. Dinamik anahtar sağlayıcısının anahtarın değerini ve bu anahtarla ilişkili tüm meta verileri döndürmesi beklenir. Anahtarın mevcut olmaması (ancak başka bir hata olmaması) durumunda sağlayıcının hasKey parametresinde false döndürmesi ve S_OK ile başarılı olması gerekir. Bu çağrının başarısız olması, anahtarın getirilememesi olarak kabul edilir ve ebeveyn model zinciri aracılığıyla anahtar aramasını açıkça durdurur. hasKey ve success içinde false döndürülürken anahtar aramaya devam edilecek. GetKey'in anahtar olarak kutulanmış özellik erişimcisini döndürmesinin son derece yasal olduğunu unutmayın. Bu, özellik erişimcisini döndüren IModelObject üzerindeki GetKey yöntemiyle benzer olacaktır.
IDynamicKeyProviderConcept'ın SetKey'i
Dinamik anahtar sağlayıcısındaki SetKey yöntemi, IModelObject üzerindeki SetKey yönteminin etkili bir şekilde geçersiz kılınan bir yöntemidir. Bu, dinamik sağlayıcıda bir anahtar ayarlar. Bu, sağlayıcıda yeni bir özelliğin oluşturulmasını etkili bir şekilde sağlar. Expando özelliklerinin oluşturulması gibi herhangi bir şeyi desteklemeyen bir sağlayıcının burada E_NOTIMPL döndürmesi gerektiğini unutmayın.
IDynamicKeyProviderConcept EnumerateKeys
Dinamik anahtar sağlayıcısındaki EnumerateKeys yöntemi, IModelObject üzerindeki EnumerateKeys yönteminin etkin bir şekilde geçersiz kılınmış olmasıdır. Bu, dinamik sağlayıcıdaki tüm anahtarları numaralandırır. Döndürülen numaralandırıcı, uygulama tarafından yerine getirilmesi gereken çeşitli kısıtlamalara sahiptir:
- EnumerateKeys çağrısı olarak davranmalı ve EnumerateKeyValues veya EnumerateKeyReferences olarak davranmamalıdır. Sağlayıcıda böyle bir kavram varsa, temel alınan özellik erişimcilerini çözmeden anahtar değerlerini döndürmelidir.
- Tek bir dinamik anahtar sağlayıcısının perspektifinden bakıldığında, fiziksel olarak ayrı anahtarlar olan aynı ada sahip birden çok anahtarı listelemek geçersizdir. Bu, üst model zinciri aracılığıyla bağlanan farklı sağlayıcılarda gerçekleşebilir, ancak tek bir sağlayıcının perspektifinden gerçekleşemez.
IDynamicConceptProviderConcept'un GetConcept
Dinamik kavram sağlayıcısındaki GetConcept yöntemi, IModelObject üzerindeki GetConcept yönteminin etkili bir şekilde geçersiz kılınmış olmasıdır. Dinamik kavram sağlayıcısı, sorgulanan kavram ve bu kavramla ilişkili meta veriler varsa bir arabirim döndürmelidir. Kavram sağlayıcıda yoksa, bu durum hasConcept argümanında false değeri döndürülerek ve başarılı bir dönüş yapılarak belirtilmelidir. Bu yöntemin başarısız olması, kavramın getirilememesidir ve kavram aramasını açıkça durdurur. hasConcept ve başarılı bir kod için false döndürülürse, üst model ağacı aracılığıyla kavram aramaya devam eder.
IDynamicConceptProviderConcept'ın SetConcept'i
Dinamik kavram sağlayıcısındaki SetConcept yöntemi, IModelObject üzerindeki SetConcept yönteminin etkili bir şekilde geçersiz kılınmış olmasıdır. Dinamik sağlayıcı kavramı atayacaktır. Bu, nesneyi yinelenebilir, dizinlenebilir, dize dönüştürülebilir vb. yapabilir. Üzerinde kavramların oluşturulmasına izin vermeyen bir sağlayıcının burada E_NOPTIMPL döndürmesi gerektiğini unutmayın.
IDynamicConceptProviderConcept'un NotifyParent
Dinamik kavram sağlayıcısındaki NotifyParent çağrısı, veri modelinin "birden çok üst model" paradigmasından daha dinamik dillere köprü oluşturulmasına olanak sağlamak üzere oluşturulan tek üst modeli dinamik sağlayıcıya bildirmek için çekirdek veri modeli tarafından kullanılır. Bu tek üst modelin herhangi bir şekilde değiştirilmesi dinamik sağlayıcıya daha fazla bildirim göndermeye neden olur. Bu geri çağırmanın dinamik kavram sağlayıcısı kavramının atanma anında gerçekleştirildiğini unutmayın.
IDynamicConceptProviderConcept'un NotifyParentChange
Dinamik kavram sağlayıcısındaki NotifyParent yöntemi, nesnenin tek üst modeli üzerinde statik bir düzenleme yapıldığında çekirdek veri modeli tarafından yapılan bir geri çağırmadır. Eklenen herhangi bir üst model için bu yöntem, söz konusu üst model eklendiğinde ilk kez ve söz konusu üst model kaldırıldığında ikinci kez çağrılır.
IDynamicConceptProviderConcept'ın NotifyDestruct
Dinamik kavram sağlayıcısındaki NotifyDestruct yöntemi, dinamik bir kavram sağlayıcısı olan nesnenin yok edilmesinin başlangıcında çekirdek veri modeli tarafından yapılan bir geri çağırmadır. Bu, istemcilere bunu gerektiren ek temizleme fırsatları sağlar.
--
Ayrıca bkz.
Bu konu, C++'tan erişilebilen arabirimleri, C++ tabanlı hata ayıklayıcı uzantısı oluşturmak için bunların nasıl kullanılacağını ve C++ veri modeli uzantısından diğer veri modeli yapılarının (örn. JavaScript veya NatVis) nasıl kullanılacağını açıklayan bir serinin parçasıdır.
Hata Ayıklayıcısı Veri Modeli C++ Genel Bakış
Hata Ayıklayıcı Veri Modeli C++ Arabirimleri
Hata Ayıklayıcı Veri Modeli C++ Nesneleri