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, betik kullanarak hata ayıklayıcı altyapısıyla otomasyonu desteklemek için Hata Ayıklayıcı Veri Modeli C++ Hata Ayıklayıcısı Veri Modeli C++ betiğinin nasıl kullanılacağı açıklanmaktadır.
Hata Ayıklayıcı Veri Modelinde Betik Yönetimi
Veri Modeli Yöneticisi'nin nesne oluşturma ve genişletilebilirlik konusunda merkezi yetkili rolüne ek olarak, soyut betik kavramının yönetiminden de sorumludur. Veri Modeli Yöneticisi'nin Betik Yöneticisi bölümü açısından bakıldığında betik, veri modelini genişletmek veya yeni işlevler sağlamak için bir sağlayıcı tarafından dinamik olarak yüklenebilen, kaldırılan ve hata ayıklaması olabilecek bir şeydir.
Betik sağlayıcısı, bir dili (ör. NatVis, JavaScript vb.) veri modeline köprüleyen bir bileşendir. Bir veya daha fazla dosya uzantısı kaydeder (örneğin: ". Sağlayıcı tarafından işlenen NatVis", ".js") bir hata ayıklayıcısı istemcisinin veya kullanıcı arabiriminin sağlayıcıya temsilci olarak bu uzantıya sahip betik dosyalarının yüklenmesine izin vermesine olanak tanır.
Çekirdek Betik Yöneticisi'ni : IDataModelScriptManager
Çekirdek betik yöneticisi arabirimi aşağıdaki gibi tanımlanır.
DECLARE_INTERFACE_(IDataModelScriptManager, IUnknown)
{
STDMETHOD(GetDefaultNameBinder)(_COM_Outptr_ IDataModelNameBinder **ppNameBinder) PURE;
STDMETHOD(RegisterScriptProvider)(_In_ IDataModelScriptProvider *provider) PURE;
STDMETHOD(UnregisterScriptProvider)(_In_ IDataModelScriptProvider *provider) PURE;
STDMETHOD(FindProviderForScriptType)(_In_ PCWSTR scriptType, _COM_Outptr_ IDataModelScriptProvider **provider) PURE;
STDMETHOD(FindProviderForScriptExtension)(_In_ PCWSTR scriptExtension, _COM_Outptr_ IDataModelScriptProvider **provider) PURE;
STDMETHOD(EnumerateScriptProviders)(_COM_Outptr_ IDataModelScriptProviderEnumerator **enumerator) PURE;
}
GetDefaultNameBinder yöntemi, veri modelinin varsayılan betik adı bağlayıcısını döndürür. Ad bağlayıcısı, bir nesne bağlamında bir adı çözümleyen bir bileşendir. Örneğin, "foo.bar" ifadesi verildiğinde, ad çubuğunu nesne foo bağlamında çözümlemek için bir ad bağlayıcısı çağrılır. Burada döndürülen bağlayıcı, veri modeli için bir dizi varsayılan kurala uyar. Betik sağlayıcıları, sağlayıcılar arasında ad çözümlemesinde tutarlılık sağlamak için bu bağlayıcıyı kullanabilir.
RegisterScriptProvider yöntemi, veri modeline yeni bir dil köprü oluşturabilen yeni bir betik sağlayıcısının mevcut olduğunu bildirir. Bu yöntem çağrıldığında, betik yöneticisi hemen verilen betik sağlayıcısını geri çağırır ve yönettiği betiklerin özelliklerini sorgular. Verilen betik sağlayıcısının belirttiği ad veya dosya uzantısı altında kayıtlı bir sağlayıcı zaten varsa, bu yöntem başarısız olur. Belirli bir ad veya dosya uzantısı için işleyici olarak yalnızca tek bir betik sağlayıcısı kaydedilebilir.
UnregisterScriptProvider yöntemi, RegisterScriptProvider yöntemine yapılan çağrıyı geri alır. Geçişli betik sağlayıcısı tarafından verilen ad ve dosya uzantısı artık onunla ilişkilendirilmez. Kayıt silindikten sonra bile betik sağlayıcısına önemli sayıda bekleyen COM başvurusu olabileceğini unutmayın. Bu yöntem yalnızca belirli bir betik sağlayıcısının yönettiği türde betiklerin yüklenmesini/oluşturulmasını engeller. Bu sağlayıcı tarafından yüklenen bir betik hala yüklüyse veya hata ayıklayıcının nesne modelini (veya veri modelini) işlediyse, bu işlemelerin yine de betikte başvuruları olabilir. Betikteki yapılara doğrudan başvuran veri modelleri, yöntemler veya nesneler olabilir. Bir betik sağlayıcısı bununla ilgilenmeye hazır olmalıdır.
FindProviderForScriptType yöntemi, betik yöneticisinde bu yöntemde belirtildiği gibi bir betik türü dizesi olan bir sağlayıcı arar. Bir yöntem bulunamazsa, bu yöntem başarısız olur; aksi takdirde, bu tür betik sağlayıcısı çağırana döndürülür.
EnumerateScriptProviders yöntemi, RegisterScriptProvider yöntemine yapılan önceki bir çağrı aracılığıyla betik yöneticisine kaydedilmiş tüm betik sağlayıcılarını numaralandıran bir numaralandırıcı döndürür.
Betik Sağlayıcısı Numaralandırması: IDataModelScriptProviderEnumerator
EnumerateScriptProviders yöntemi aşağıdaki formun bir numaralandırıcısını döndürür:
DECLARE_INTERFACE_(IDataModelScriptProviderEnumerator, IUnknown)
{
STDMETHOD(Reset)() PURE;
STDMETHOD(GetNext)(_COM_Outptr_ IDataModelScriptProvider **provider) PURE;
}
Reset yöntemi, numaralandırıcıyı ilk öğeyi döndürmeden önce bulunduğu konuma taşır.
GetNext yöntemi numaralandırıcıyı bir öğe ileri taşır ve bu öğedeki betik sağlayıcısını döndürür. Numaralandırıcı numaralandırmanın sonuna ulaştığında E_BOUNDS döndürülür. Bu hatayı aldıktan sonra GetNext yöntemini çağırmak süresiz olarak E_BOUNDS döndürmeye devam edecektir.
Betik Oluşturma için Hata Ayıklayıcı Veri Modeli C++ Konak Arabirimlerini
Ana Bilgisayarın Betik Oluşturma Rolünü
Hata ayıklama konağı, hata ayıklama hedeflerinin tür sisteminin doğasını anlamak, ifadeleri hata ayıklama hedeflerinin dilinde değerlendirmek vb. için çok düşük düzeyli arabirimler sunar. Normalde, betik oluşturma gibi daha yüksek düzeyli yapılarla ayrıştırılmaz. Bu, genel hata ayıklayıcısı uygulamasına veya bu özellikleri sağlayan uzantılara bırakılır. Ancak bunun bir istisnası vardır. Veri modeli tarafından sunulan genel betik deneyimine katılmak isteyen tüm hata ayıklama konaklarının betiklere bağlam sağlamak için birkaç basit arabirim uygulaması gerekir. Sonuç olarak, hata ayıklama ana bilgisayarı betik ortamının işlevleri ve sağlanan diğer betik işlevlerini veri modelinin ad alanına yerleştirmesini istediği yeri denetler. Bu işleme dahil olmak, konağın örneğin ifade değerlendiricisinde bu tür işlevlerin kullanılmasına izin vermesine (veya kullanmamasına) olanak tanır. Konağın perspektifinden katılan arabirimler şunlardır:
Hata Ayıklama Ana Bilgisayarının Betik Kona : IDebugHostScriptHost
IDebugHostScriptHost arabirimi, bir betik sağlayıcısı tarafından yeni oluşturulan bir betiğin hata ayıklama konağından bağlam almak için kullanılan arabirimdir. Bu bağlam, betik sağlayıcısının veri modeli ile betik ortamı arasında köprüler yerleştirebildiği bir nesne (hata ayıklama konağı tarafından sağlanır) içerir. Bu tür köprüler, örneğin betik işlevlerini çağıran veri modeli yöntemleri olabilir. Bunu yapmak, veri modeli tarafındaki bir çağıranın IModelMethod arabiriminde Call yöntemini kullanarak betik yöntemlerini çağırmasına olanak tanır.
IDebugHostScriptHost arabirimi aşağıdaki gibi tanımlanır.
DECLARE_INTERFACE_(IDebugHostScriptHost, IUnknown)
{
STDMETHOD(CreateContext)(_In_ IDataModelScript* script, _COM_Outptr_ IDataModelScriptHostContext** scriptContext) PURE;
}
CreateContext yöntemi, betiğin içeriğinin yerleştirildiği yeni bir bağlam oluşturmak için bir betik sağlayıcısı tarafından çağrılır. Bu bağlam, Veri Modeli C++ Betik Arabirimleri sayfasında ayrıntılı olarak açıklanan IDataModelScriptHostContext arabirimiyle temsil edilir.
Hata Ayıklayıcısı Veri Modeli C++ Betik Arabirimleri
Betik ve Betik Arabirimleri
Veri modelinin genel mimarisi, bir üçüncü tarafın bir dil ile veri modelinin nesne modeli arasında bir köprü tanımlamasına olanak tanır. Genellikle, veri modelinin ortamı çok dinamik olduğundan köprülenen dil bir betik dilidir. Bu köprüyü bir dil ile veri modelinin nesne modeli arasında tanımlayan ve uygulayan bir bileşene betik sağlayıcısı adı verilir. Betik sağlayıcısı başlatıldığında, veri modeli yöneticisinin betik yöneticisi bölümüne kendisini kaydeder ve genişletilebilirliği yöneten tüm arabirimler daha sonra betik sağlayıcısının yönettiği dile yazılan betiklerin düzenlenmesine, yüklenmesine, kaldırılmasına ve hata ayıklamasına olanak sağlar.
Windows için Hata Ayıklama Araçları'nın şu anda iki betik sağlayıcısı tanımladığını unutmayın.
- NatVis Sağlayıcısı. Bu sağlayıcı, NatVis XML ile veri modelleri arasındaki DbgEng.dll ve köprülere eklenmiştir ve yerel/dil veri türlerinin görselleştirmesine olanak tanır.
- JavaScript Sağlayıcısı. Bu sağlayıcı eski bir hata ayıklayıcısı uzantısında yer alır: JsProvider.dll. JavaScript dilinde yazılmış betikler ile veri modeli arasında köprü oluşturarak rastgele hata ayıklayıcı denetimi ve genişletilebilirlik biçimleri sağlar.
Veri modeline diğer dilleri (örneğin Python, vb.) köprüleyen yeni sağlayıcılar yazılabilir. Bu, yükleme amacıyla eski hata ayıklayıcı uzantılarında şu anda kapsüllenmiş olacaktır. Betik sağlayıcısının kendisi, eski altyapı arabirimleriyle bağımlılığı en aza indirmeli ve yalnızca mümkün olduğunda veri modeli API'lerini kullanmalıdır. Bu sayede sağlayıcı önemli ölçüde daha kolay bir şekilde diğer ortamlara taşınabilir hale getirilebilir.
Betik sağlayıcılarıyla ilgili iki arabirim sınıfı vardır. İlk arabirim sınıfı, betik sağlayıcılarının ve yönettikleri betiklerin genel yönetimi içindir. İkinci arabirim sınıfı, betik hata ayıklama desteği içindir. İlk küme için destek zorunlu olsa da, ikinci küme için destek isteğe bağlıdır ve her sağlayıcı için anlamlı olmayabilir.
Genel yönetim arabirimleri şunlardır:
| Arayüz | Açıklama |
|---|---|
| IDataModelScriptProvider | Bir betik sağlayıcısının uygulaması gereken temel arabirim. Bu, sağlayıcının belirli bir betik türü desteğini tanıtmak ve belirli bir dosya uzantısına kaydolmak için veri modeli yöneticisinin betik yöneticisi bölümüne kaydedilen arabirimdir |
| IDataModelScript | Sağlayıcı tarafından yönetilen belirli bir betiğin soyutlaması. Yüklenen veya düzenlenen her betiğin ayrı bir IDataModelScript örneği vardır |
| IDataModelScriptClient | Bir kullanıcı arabirimine bilgi iletmek için betik sağlayıcısı tarafından kullanılan bir istemci arabirimi. Betik sağlayıcıları bu arabirimi uygulamaz. Betik sağlayıcılarından yararlanmak isteyen veri modelini barındıran uygulama bunu yapar. Bir betik sağlayıcısı, durumu, hataları vb. bildirmek için betik istemcisinin yöntemlerini çağırır. |
| IDataModelScriptHostContext | Betik sağlayıcısı tarafından betiğin içeriği için kapsayıcı olarak kullanılan bir konak arabirimi. Bir betiğin içeriğinin, hata ayıklayıcı uygulamasının nesne modeline gerçekleştirdiği işlemeler dışında, belirli bir hata ayıklama konağına nasıl ait olduğu. Bu arabirim, betik sağlayıcısının içeriğini nereye yerleştireceği hakkında bilgi almasına olanak tanır. |
| IDataModelScriptTemplate | Betik sağlayıcıları, kullanıcıların betik yazması için başlangıç noktası görevi görecek bir veya daha fazla şablon sağlayabilir. Yerleşik bir düzenleyici sağlayan bir hata ayıklayıcısı uygulaması, bu arabirim aracılığıyla sağlayıcı tarafından tanıtılan şablon içeriğiyle yeni betikleri önceden doldurabilir. |
| IDataModelScriptTemplateEnumerator | Betik sağlayıcısının desteklediği tüm çeşitli şablonları tanıtmak için uyguladığı bir numaralandırıcı arabirimi. |
| IDataModelNameBinder | Ad bağlayıcısı -- bir bağlamdaki bir adı bir değerle ilişkilendirebilen bir nesne. "foo.bar" gibi belirli bir ifade için, ad bağlayıcısı "bar" adını "foo" nesnesi bağlamında bağlayabilir ve buna bir değer veya başvuru üretebiliyor. Ad bağlayıcıları genellikle bir betik sağlayıcısı tarafından uygulanmaz; bunun yerine, varsayılan bağlayıcı veri modelinden edinilebilir ve betik sağlayıcısı tarafından kullanılabilir |
Hata ayıklama arabirimleri şunlardır:
| Arayüz | Açıklama |
|---|---|
| IDataModelScriptDebug | Betik sağlayıcısının bir betiği hata ayıklanabilir hale getirmek için sağlaması gereken temel arabirim. Betik hata ayıklanabilirse IDataModelScript arabiriminin uygulama sınıfı IDataModelScriptDebug için QueryInterface olmalıdır. |
| IDataModelScriptDebugClient | Betik hata ayıklama özelliğini sağlamak isteyen kullanıcı arabirimi, IDataModelScriptDebugClient arabirimini uygular. Betik sağlayıcısı, hata ayıklama bilgilerini ileri geri geçirmek için bu arabirimi kullanır (ör. gerçekleşen olaylar, kesme noktaları vb.) |
| IDataModelScriptDebugStack | Betik sağlayıcısı, bir çağrı yığınını betik hata ayıklayıcısına göstermek için bu arabirimi uygular. |
| IDataModelScriptDebugStackFrame | Betik sağlayıcısı, çağrı yığını içinde belirli bir yığın çerçevesinin açıklamasını ortaya çıkarmak için bu arabirimi uygular. |
| IDataModelScriptDebugVariableSetEnumerator | Betik sağlayıcısı, bir dizi değişkeni kullanıma açmak için bu arabirimi uygular. Bu küme, bir işlevin parametre kümesini, yerel değişken kümesini veya belirli bir kapsamdaki değişken kümesini temsil edebilir. Tam anlam, arabirimin nasıl edinildiğine bağlıdır. |
| IDataModelScriptDebugBreakpoint | Betik sağlayıcısı, betik içindeki belirli bir kesme noktasının ve denetiminin notunu ortaya çıkarmak için bu arabirimi uygular. |
| IDataModelScriptDebugBreakpointEnumerator | Betik sağlayıcısı, şu anda betik içinde mevcut olan tüm kesme noktalarını numaralandırmak için bunu uygular (etkin olsun veya olmasın). |
Çekirdek Betik Sağlayıcısını : IDataModelScriptProvider
Betik sağlayıcısı olmak isteyen herhangi bir uzantının IDataModelScriptProvider arabiriminin bir uygulamasını sağlaması ve RegisterScriptProvider yöntemi aracılığıyla veri modeli yöneticisinin betik yöneticisi bölümüne kaydetmesi gerekir. Uygulanması gereken bu çekirdek arabirim aşağıdaki gibi tanımlanır.
DECLARE_INTERFACE_(IDataModelScriptProvider, IUnknown)
{
STDMETHOD(GetName)(_Out_ BSTR *name) PURE;
STDMETHOD(GetExtension)(_Out_ BSTR *extension) PURE;
STDMETHOD(CreateScript)(_COM_Outptr_ IDataModelScript **script) PURE;
STDMETHOD(GetDefaultTemplateContent)(_COM_Outptr_ IDataModelScriptTemplate **templateContent) PURE;
STDMETHOD(EnumerateTemplates)(_COM_Outptr_ IDataModelScriptTemplateEnumerator **enumerator) PURE;
}
GetName yöntemi, sağlayıcının SysAllocString yöntemi aracılığıyla ayrılmış bir dize olarak yönettiği betik türünün (veya dilinin) adını döndürür. Çağıran, SysFreeString aracılığıyla döndürülen dizeyi serbest bırakabilirsiniz. Bu yöntemden döndürülebilecek dizelere örnek olarak "JavaScript" veya "NatVis" verilebilir. Döndürülen dize büyük olasılıkla veri modelini barındıran hata ayıklayıcı uygulamasının kullanıcı arabiriminde görünür. Hiçbir iki betik sağlayıcısı aynı adı döndürebilir (büyük/küçük harfe duyarsız).
GetExtension yöntemi, bu sağlayıcı tarafından yönetilen betikler için dosya uzantısını (nokta olmadan) SysAllocString yöntemi aracılığıyla ayrılan bir dize olarak döndürür. Veri modelini barındıran hata ayıklayıcı uygulaması (betik desteğiyle), betik sağlayıcısına bu uzantıyla betik dosyalarının açılmasını temsilci olarak verir. Çağıran, SysFreeString aracılığıyla döndürülen dizeyi serbest bırakabilirsiniz. Bu yöntemden döndürülebilecek dizelere örnek olarak "js" veya "NatVis" verilebilir.
CreateScript yöntemi, yeni bir betik oluşturmak için çağrılır. Betik sağlayıcısı, bu yöntem her çağrıldığında döndürülen IDataModelScript arabirimi tarafından temsil edilen yeni ve boş bir betik döndürmelidir. Bu yöntemin, kullanıcı arabiriminin kullanıcı tarafından düzenlemek için yeni bir boş betik oluşturmasından veya hata ayıklayıcı uygulamasının diskten bir betik yüklemesinden bağımsız olarak çağrıldığını unutmayın. Sağlayıcı, dosya G/Ç'ye dahil olmaz. Yalnızca IDataModelScript'te yöntemlere geçirilen akışlar aracılığıyla barındırma uygulamasından gelen istekleri işler.
GetDefaultTemplateContent yöntemi, sağlayıcının varsayılan şablon içeriği için bir arabirim döndürür. Bu, betik sağlayıcısının yeni oluşturulan bir betik için düzenleme penceresinde önceden doldurulmalarını istediğiniz içeriktir. Betik sağlayıcısında şablon yoksa (veya varsayılan içerik olarak belirlenmiş şablon içeriği yoksa), betik sağlayıcısı bu yöntemden E_NOTIMPL döndürebilir.
EnumerateTemplates yöntemi, betik sağlayıcısı tarafından sağlanan çeşitli şablonları numaralandırabilen bir numaralandırıcı döndürür. Şablon içeriği, betik sağlayıcısının yeni bir betik oluştururken düzenleme penceresine "önceden doldurulmak" istediği içeriktir. Desteklenen birden çok farklı şablon varsa, bu şablonlar adlandırılabilir (örneğin: "Kesinlik Temelli Betik", "Uzantı Betiği") ve veri modelini barındıran hata ayıklayıcı uygulaması "şablonların" kullanıcıya nasıl sunileceğini seçebilir.
Çekirdek Betik Arabirimini : IDataModelScript
Sağlayıcı tarafından uygulanan tek bir betiği yöneten ana arabirim, IDataModelScript arabirimidir. İstemci yeni bir boş betik oluşturmak istediğinde ve IDataModelScriptProvider üzerinde CreateScript yöntemini çağırdığında bu arabirimi uygulayan bir bileşen döndürülür.
Sağlayıcı tarafından oluşturulan her betik bağımsız bir siloda olmalıdır. Bir betik, veri modeli aracılığıyla dış nesnelerle açık etkileşim dışında başka bir betiği etkilememelidir. Örneğin, iki betik de bir tür veya kavramı genişletebilir (örn. hata ayıklayıcının işlemin ne olduğu kavramı). İki betik de dış işlem nesnesi aracılığıyla birbirlerinin alanlarına erişebilir.
Arabirim aşağıdaki gibi tanımlanır.
DECLARE_INTERFACE_(IDataModelScript, IUnknown)
{
STDMETHOD(GetName)(_Out_ BSTR *scriptName) PURE;
STDMETHOD(Rename)(_In_ PCWSTR scriptName) PURE;
STDMETHOD(Populate)(_In_ IStream *contentStream) PURE;
STDMETHOD(Execute)(_In_ IDataModelScriptClient *client) PURE;
STDMETHOD(Unlink)() PURE;
STDMETHOD(IsInvocable)(_Out_ bool *isInvocable) PURE;
STDMETHOD(InvokeMain)(_In_ IDataModelScriptClient *client) PURE;
}
GetName yöntemi, betiğin adını SysAllocString işlevi aracılığıyla ayrılmış bir dize olarak döndürür. Betiğin henüz bir adı yoksa yöntemi null BSTR döndürmelidir. Bu durumda başarısız olmamalıdır. Betik, Rename yöntemine yapılan bir çağrıyla açıkça yeniden adlandırıldıysa, GetName yöntemi yeni atanan adı döndürmelidir.
Rename yöntemi betiğine yeni bir ad atar. Bu adı kaydetmek ve GetName yöntemine yapılan herhangi bir çağrıda döndürmek betik uygulamasının sorumluluğundadır. Bu genellikle bir kullanıcı arabirimi betiği yeni bir adla Farklı Kaydet'i seçtiğinde çağrılır. Betiği yeniden adlandırmanın, barındırma uygulamasının betiğin içeriğini yansıtmayı seçtiği yeri etkileyebileceğini unutmayın.
Betiğin "içeriğini" değiştirmek veya eşitlemek için Populate yöntemi istemci tarafından çağrılır. Bu, betik sağlayıcısına betiğin kodunun değiştiğini belirten bildirimdir. Bu yöntemin betiğin yürütülmesine veya betiğin yönlendirdiği nesnelerden herhangi birinde değişikliklere neden olmadığını unutmayın. Bu yalnızca betik sağlayıcısına, betiğin içeriğinin kendi iç durumunu eşitleyebilmesi için değiştirildiğine ilişkin bir bildirimdir.
Execute yöntemi, son başarılı Doldurma çağrısı tarafından dikte edilen betiğin içeriğini yürütür ve hata ayıklayıcının nesne modelini bu içeriğe göre değiştirir. Dil (veya betik sağlayıcısı) bir "ana işlev" tanımlıyorsa (yazarın kullanıcı arabiriminde hayali bir "Betiği Yürüt" düğmesine tıkladıktan sonra çağrılmasını istediği işlev), bu tür bir "ana işlev" Yürütme işlemi sırasında çağrılmaz. Yürütme işlemi yalnızca başlatma ve nesne modeli işlemeleri gerçekleştirmek için düşünülebilir (örneğin: kök kodu yürütme ve genişletilebilirlik noktalarını ayarlama).
Bağlantıyı Kaldır yöntemi Yürüt işlemini geri alır. Betiğin yürütülmesi sırasında oluşturulan nesne modeli işlemeleri veya genişletilebilirlik noktaları geri alınıyor. Bağlantıyı Kaldırma işleminden sonra betik, Execute çağrısıyla yeniden yürütülebilir veya serbest bırakılabilir.
IsInvocable yöntemi, betiğin çağrılabilir olup olmadığını, yani dili veya sağlayıcısı tarafından tanımlanan bir "ana işleve" sahip olup olmadığını döndürür. Böyle bir "ana işlev", bir kullanıcı arabiriminde sanal bir "Betiği Yürüt" düğmesine basıldığında betik yazarının çağrılmasını isteyeceği kavramsal bir işlevdir.
Betiğin kullanıcı arabirimi çağrısından yürütülmesi amaçlanan bir "ana işlevi" varsa, IsInvocable yönteminden doğru bir dönüş aracılığıyla bunu gösterir. Kullanıcı arabirimi, betiği gerçekten "çağırmak" için InvokeMain yöntemini çağırabilir. Bunun, tüm kök kodu çalıştıran ve betiği temel konağın ad alanına köprüleyen Execute'dan farklı olduğunu unutmayın.
**Betik İstemcisi: IDataModelScriptClient **
Betikleri yönetmek isteyen ve bu fikir etrafında bir kullanıcı arabirimine (grafik veya konsol) sahip olmak isteyen veri modelini barındıran bir uygulama, IDataModelScriptClient arabirimini uygular. Bu arabirim, yürütme veya çağırma sırasında herhangi bir betik sağlayıcısına veya hata ve olay bilgilerini kullanıcı arabirimine geri geçirmek için bir betike geçirilir.
IDataModelScriptClient arabirimi aşağıdaki gibi tanımlanır.
DECLARE_INTERFACE_(IDataModelScriptClient, IUnknown)
{
STDMETHOD(ReportError)(_In_ ErrorClass errClass, _In_ HRESULT hrFail, _In_opt_ PCWSTR message, _In_ ULONG line, _In_ ULONG position) PURE;
}
Betiği yürütme veya çağırma sırasında bir hata oluşursa, betik sağlayıcısı hatanın kullanıcı arabirimini bilgilendirmek için ReportError yöntemini çağırır.
Betiğin Konak Bağlamı: IDataModelScriptHostContext
Hata ayıklama konağı, veri modeli betiği içeriğinin nasıl ve nerede projelendiği üzerinde bazı etkilere sahiptir. Her betiğin konakta betike köprüler yerleştirileceği bağlamı istemesi beklenir (örn. çağrılabilen işlev nesneleri vb.). Bu bağlam, IDebugHostScriptHost üzerinde CreateContext yöntemini çağırarak ve bir IDataModelScriptHostContext alarak alınır.
IDataModelScriptHostContext arabirimi aşağıdaki gibi tanımlanır.
DECLARE_INTERFACE_(IDataModelScriptHostContext, IUnknown)
{
STDMETHOD(NotifyScriptChange)(_In_ IDataModelScript* script, _In_ ScriptChangeKind changeKind) PURE;
STDMETHOD(GetNamespaceObject)(_COM_Outptr_ IModelObject** namespaceObject) PURE;
}
Betik sağlayıcısının, ilişkili bağlamda NotifyScriptChange yöntemine yapılan bir yöntem çağrısıyla gerçekleşen belirli işlemler üzerine hata ayıklama ana bilgisayarına bildirmesi gerekir. Bu tür işlemler ScriptChangeKind numaralandırmasının üyeleri olarak tanımlanır
GetNamespaceObject yöntemi, betik sağlayıcısının veri modeli ile betik arasına köprü yerleştirebileceği bir nesne döndürür. Burada, örneğin, betik sağlayıcısının veri modeli yöntemi nesnelerini (IModelObject içine kutulanmış IModelMethod arabirimleri) yerleştirebileceği ve bu nesnelerin uygulaması betikteki karşılık gelen adlandırılmış işlevlere çağrıda bulunabilir.
Yeni Oluşturulan Betikler için Şablonları: IDataModelScriptTemplate
Yeni betikler için önceden doldurulmuş içerik sunmak isteyen betik sağlayıcıları (örn. kullanıcıların bir hata ayıklayıcı kullanıcı arabiriminde betik yazmasına yardımcı olmak için), bir veya daha fazla betik şablonu sağlayarak bunu yapabilir. Bu tür şablonlar, IDataModelScriptTemplate arabirimini uygulayan ve betik sağlayıcısında GetDefaultTemplate veya EnumerateTemplates yöntemi aracılığıyla döndürülen bileşenlerdir.
IDataModelScriptTemplate arabirimi aşağıdaki gibi tanımlanır.
DECLARE_INTERFACE_(IDataModelScriptTemplate, IUnknown)
{
STDMETHOD(GetName)(_Out_ BSTR *templateName) PURE;
STDMETHOD(GetDescription)(_Out_ BSTR *templateDescription) PURE;
STDMETHOD(GetContent)(_COM_Outptr_ IStream **contentStream) PURE;
}
GetName yöntemi şablonun adını döndürür. Şablonun bir adı yoksa bu işlem E_NOTIMPL başarısız olabilir. Tek bir varsayılan şablonun (varsa) bir ada sahip olması gerekmez. Diğer tüm şablonlar şunlardır: Bu adlar, oluşturulacak şablonu seçmek için bir menünün parçası olarak bir kullanıcı arabiriminde sunulabilir.
GetDescription yöntemi şablonun açıklamasını döndürür. Bu tür bir açıklama, kullanıcının şablonun ne yapmak için tasarlandığını anlamasına yardımcı olmak için kullanıcıya daha açıklayıcı arabirimlerde sunulur. Şablonun açıklaması yoksa bu yöntemden E_NOTIMPL döndürebilir.
GetContent yöntemi, şablonun içeriğini (veya kodunu) döndürür. Bir kullanıcı bu şablondan yeni bir betik oluşturmayı seçtiğinde düzenleme penceresine önceden doldurulacak olan budur. Şablon, istemcinin çekebileceği içerik üzerinde standart bir akış oluşturmak (ve döndürmek) için sorumludur.
Sağlayıcının Şablon İçeriğinin Numaralandırması: IDataModelScriptTemplateEnumerator
Bir betik sağlayıcısı, bazı kullanıcı arabiriminde içeriği yeni oluşturulan betiklere önceden dolduran bir veya daha fazla şablon sağlayabilir. Bu şablonlardan herhangi biri sağlanırsa betik sağlayıcısı, EnumerateTemplates yöntemine yapılan bir çağrı üzerine döndürülen bir numaralandırıcı uygulamalıdır.
Böyle bir numaralandırıcı, IDataModelScriptTemplateEnumerator arabiriminin bir uygulamasıdır ve aşağıdaki gibi tanımlanır.
DECLARE_INTERFACE_(IDataModelScriptTemplateEnumerator, IUnknown)
{
STDMETHOD(Reset)() PURE;
STDMETHOD(GetNext)(_COM_Outptr_ IDataModelScriptTemplate **templateContent) PURE;
}
Reset yöntemi, numaralandırıcıyı ilk oluşturulduğu konuma (ilk şablon oluşturulmadan önce) sıfırlar.
GetNext yöntemi numaralandırıcıyı sonraki şablona taşır ve döndürür. Numaralandırmanın sonunda numaralandırıcı E_BOUNDS döndürür. E_BOUNDS işaretçisine isabet edildikten sonra, numaralandırıcı sıfırla çağrısı yapılana kadar süresiz olarak E_BOUNDS hataları üretmeye devam eder.
Adların Anlamını Çözümleme: IDataModelNameBinder
Veri modeli, betik sağlayıcılarının belirli bir bağlamda belirli bir adın anlamını belirlemesi için standart bir yol sağlar (ör. foo.bar için çubuğun ne anlama geldiğini belirleme). Bu mekanizma ad bağlayıcısı olarak bilinir ve IDataModelNameBinder arabirimi tarafından temsil edilir. Böyle bir bağlayıcı, adın nasıl çözümlendiği ve bir adın nesne üzerinde birden çok kez tanımlandığı çakışma çözümlemesiyle nasıl başa çıkıldığı hakkında bir dizi kuralı kapsüller. Bu kuralların bir bölümü, yansıtılan bir adın (veri modeli tarafından eklenen) yerel bir ada (hata ayıklanan dilin tür sisteminde bir ad) karşı çözümlenmesi gibi şeyleri içerir.
Betik sağlayıcıları arasında bir tutarlılık derecesi sağlamak için veri modelinin betik yöneticisi varsayılan bir ad bağlayıcısı sağlar. Bu varsayılan ad bağlayıcısı, IDataModelScriptManager arabirimindeki GetDefaultNameBinder yöntemine yapılan bir çağrı aracılığıyla edinilebilir. Ad bağlayıcı arabirimi aşağıdaki gibi tanımlanır.
DECLARE_INTERFACE_(IDataModelNameBinder, IUnknown)
{
STDMETHOD(BindValue)(_In_ IModelObject* contextObject, _In_ PCWSTR name, _COM_Errorptr_ IModelObject** value, _COM_Outptr_opt_result_maybenull_ IKeyStore** metadata) PURE;
STDMETHOD(BindReference)(_In_ IModelObject* contextObject, _In_ PCWSTR name, _COM_Errorptr_ IModelObject** reference, _COM_Outptr_opt_result_maybenull_ IKeyStore** metadata) PURE;
STDMETHOD(EnumerateValues)(_In_ IModelObject* contextObject, _COM_Outptr_ IKeyEnumerator** enumerator) PURE;
STDMETHOD(EnumerateReferences)(_In_ IModelObject* contextObject, _COM_Outptr_ IKeyEnumerator** enumerator) PURE;
}
BindValue yöntemi, bağlama kuralları kümesine göre verilen nesnede contextObject.name eşdeğerini gerçekleştirir. Bu bağlamanın sonucu bir değerdir. Değer olarak, temel alınan betik sağlayıcısı değeri kullanarak yeniden ada atama gerçekleştiremez.
BindReference yöntemi, bağlama kuralları kümesine göre verilen nesnede contextObject.name eşdeğerini de gerçekleştirdiğinden BindValue'ya benzer. Ancak bu yöntemden bağlamanın sonucu değer yerine başvurudur. Başvuru olarak, betik sağlayıcısı yeniden ada atama gerçekleştirmek için başvuruyu kullanabilir.
EnumerateValues yöntemi, BindValue yönteminin kurallarına göre nesneye bağlanacak ad ve değer kümesini numaralandırır. IModelObject üzerindeki EnumerateKeys, EnumerateValues ve benzer yöntemlerin aksine, aynı değere sahip birden çok ad döndürebilir (temel sınıflar, üst modeller ve benzeri için), bu numaralandırıcı yalnızca BindValue ve BindReference ile bağlanacak belirli ad kümesini döndürür. Adlar hiçbir zaman çoğaltılamaz. Ad bağlayıcısı aracılığıyla bir nesneyi listelemenin, IModelObject yöntemlerini çağırmaktan çok daha yüksek bir maliyeti olduğunu unutmayın.
EnumerateReferences yöntemi, BindReference yönteminin kurallarına göre nesneye bağlanacak ad ve başvuru kümesini numaralandırır. IModelObject üzerindeki EnumerateKeys, EnumerateValues ve benzer yöntemlerin aksine, aynı değere sahip birden çok ad döndürebilir (temel sınıflar, üst modeller ve benzeri için), bu numaralandırıcı yalnızca BindValue ve BindReference ile bağlanacak belirli ad kümesini döndürür. Adlar hiçbir zaman çoğaltılamaz. Ad bağlayıcısı aracılığıyla bir nesneyi listelemenin, IModelObject yöntemlerini çağırmaktan çok daha yüksek bir maliyeti olduğunu unutmayın.
Hata Ayıklayıcısı Veri Modeli C++ Betik Hata Ayıklama Arabirimleri
Veri modelindeki betik sağlayıcıları için altyapı, betiklerin hata ayıklaması ile ilgili bir kavram da sağlar. Hata ayıklama özelliklerini hata ayıklama konağına ve veri modelini barındıran hata ayıklayıcı uygulamasına göstermek isteyen tüm betikler, hata ayıklanabilir betiklerin IDataModelScript arabirimine ek olarak IDataModelScriptDebug arabirimini uygulamasına izin vererek bunu yapabilir. Betikte bu arabirimin varlığı, altyapıya hata ayıklanabilir olduğunu gösterir.
IDataModelScriptDebug arabirimi, bir betik sağlayıcısının hata ayıklama özelliklerine erişim elde etmek için başlangıç noktası olsa da, genel hata ayıklama özellikleri sağlama konusunda bir dizi diğer arabirimle birleştirilir.
Hata ayıklama arabirimleri şunlardır:
| Arayüz | Açıklama |
|---|---|
| IDataModelScriptDebug | Betik sağlayıcısının bir betiği hata ayıklanabilir hale getirmek için sağlaması gereken temel arabirim. Betik hata ayıklanabilirse IDataModelScript arabiriminin uygulama sınıfı IDataModelScriptDebug için QueryInterface olmalıdır. |
| IDataModelScriptDebugClient | Betik hata ayıklama özelliğini sağlamak isteyen kullanıcı arabirimi, IDataModelScriptDebugClient arabirimini uygular. Betik sağlayıcısı, hata ayıklama bilgilerini ileri geri geçirmek için bu arabirimi kullanır (ör. gerçekleşen olaylar, kesme noktaları vb.) |
| IDataModelScriptDebugStack | Betik sağlayıcısı, bir çağrı yığınını betik hata ayıklayıcısına göstermek için bu arabirimi uygular. |
| IDataModelScriptDebugStackFrame | Betik sağlayıcısı, çağrı yığını içinde belirli bir yığın çerçevesinin açıklamasını ortaya çıkarmak için bu arabirimi uygular. |
| IDataModelScriptDebugVariableSetEnumerator | Betik sağlayıcısı, bir dizi değişkeni kullanıma açmak için bu arabirimi uygular. Bu küme, bir işlevin parametre kümesini, yerel değişken kümesini veya belirli bir kapsamdaki değişken kümesini temsil edebilir. Tam anlam, arabirimin nasıl edinildiğine bağlıdır. |
| IDataModelScriptDebugBreakpoint | Betik sağlayıcısı, betik içindeki belirli bir kesme noktasının ve denetiminin notunu ortaya çıkarmak için bu arabirimi uygular. |
| IDataModelScriptDebugBreakpointEnumerator | Betik sağlayıcısı, şu anda betik içinde mevcut olan tüm kesme noktalarını numaralandırmak için bunu uygular (etkin olsun veya olmasın). |
Genel yönetim arabirimleri şunlardır:
| Arayüz | Açıklama |
|---|---|
| IDataModelScriptProvider | Bir betik sağlayıcısının uygulaması gereken temel arabirim. Bu, sağlayıcının belirli bir betik türü desteğini tanıtmak ve belirli bir dosya uzantısına kaydolmak için veri modeli yöneticisinin betik yöneticisi bölümüne kaydedilen arabirimdir |
| IDataModelScript | Sağlayıcı tarafından yönetilen belirli bir betiğin soyutlaması. Yüklenen veya düzenlenen her betiğin ayrı bir IDataModelScript örneği vardır |
| IDataModelScriptClient | Bir kullanıcı arabirimine bilgi iletmek için betik sağlayıcısı tarafından kullanılan bir istemci arabirimi. Betik sağlayıcıları bu arabirimi uygulamaz. Betik sağlayıcılarından yararlanmak isteyen veri modelini barındıran uygulama bunu yapar. Bir betik sağlayıcısı, durumu, hataları vb. bildirmek için betik istemcisinin yöntemlerini çağırır. |
| IDataModelScriptHostContext | Betik sağlayıcısı tarafından betiğin içeriği için kapsayıcı olarak kullanılan bir konak arabirimi. Bir betiğin içeriğinin, hata ayıklayıcı uygulamasının nesne modeline gerçekleştirdiği işlemeler dışında, belirli bir hata ayıklama konağına nasıl ait olduğu. Bu arabirim, betik sağlayıcısının içeriğini nereye yerleştireceği hakkında bilgi almasına olanak tanır. |
| IDataModelScriptTemplate | Betik sağlayıcıları, kullanıcıların betik yazması için başlangıç noktası görevi görecek bir veya daha fazla şablon sağlayabilir. Yerleşik bir düzenleyici sağlayan bir hata ayıklayıcısı uygulaması, bu arabirim aracılığıyla sağlayıcı tarafından tanıtılan şablon içeriğiyle yeni betikleri önceden doldurabilir. |
| IDataModelScriptTemplateEnumerator | Betik sağlayıcısının desteklediği tüm çeşitli şablonları tanıtmak için uyguladığı bir numaralandırıcı arabirimi. |
| IDataModelNameBinder | Ad bağlayıcısı -- bir bağlamdaki bir adı bir değerle ilişkilendirebilen bir nesne. "foo.bar" gibi belirli bir ifade için, ad bağlayıcısı "bar" adını "foo" nesnesi bağlamında bağlayabilir ve buna bir değer veya başvuru üretebiliyor. Ad bağlayıcıları genellikle bir betik sağlayıcısı tarafından uygulanmaz; bunun yerine, varsayılan bağlayıcı veri modelinden alınıp betik sağlayıcısı tarafından kullanılabilir. |
Betikleri Hata Ayıklanabilir Hale Getirme: IDataModelScriptDebug
Hata ayıklanabilir herhangi bir betik, IDataModelScript'i uygulayan aynı bileşende IDataModelScriptDebug arabiriminin varlığı yoluyla bu özelliği gösterir. Hata ayıklama ana bilgisayarı veya veri modelini barındıran hata ayıklayıcı uygulaması tarafından bu arabirimin sorgusu, hata ayıklama özelliğinin varlığını gösterir.
IDataModelScriptDebug arabirimi aşağıdaki gibi tanımlanır.
DECLARE_INTERFACE_(IDataModelScriptDebug, IUnknown)
{
STDMETHOD_(ScriptDebugState, GetDebugState)() PURE;
STDMETHOD(GetCurrentPosition)(_Out_ ScriptDebugPosition *currentPosition, _Out_opt_ ScriptDebugPosition *positionSpanEnd, _Out_opt_ BSTR *lineText) PURE;
STDMETHOD(GetStack)(_COM_Outptr_ IDataModelScriptDebugStack **stack) PURE;
STDMETHOD(SetBreakpoint)(_In_ ULONG linePosition, _In_ ULONG columnPosition, _COM_Outptr_ IDataModelScriptDebugBreakpoint **breakpoint) PURE;
STDMETHOD(FindBreakpointById)(_In_ ULONG64 breakpointId, _COM_Outptr_ IDataModelScriptDebugBreakpoint **breakpoint) PURE;
STDMETHOD(EnumerateBreakpoints)(_COM_Outptr_ IDataModelScriptDebugBreakpointEnumerator **breakpointEnum) PURE;
STDMETHOD(GetEventFilter)(_In_ ScriptDebugEventFilter eventFilter, _Out_ bool *isBreakEnabled) PURE;
STDMETHOD(SetEventFilter)(_In_ ScriptDebugEventFilter eventFilter, _In_ bool isBreakEnabled) PURE;
STDMETHOD(StartDebugging)(_In_ IDataModelScriptDebugClient *debugClient) PURE;
STDMETHOD(StopDebugging)(_In_ IDataModelScriptDebugClient *debugClient) PURE;
}
GetDebugState yöntemi betiğin geçerli durumunu döndürür (örn. yürütülüp yürütülmediği). Durum, ScriptDebugState sabit listesi içindeki bir değer tarafından tanımlanır.
GetCurrentPosition' yöntemi betik içindeki geçerli konumu döndürür. Bu yalnızca betik hata ayıklayıcıya bölündüğünde çağrılabilir. GetScriptState çağrısı ScriptDebugBreak döndürebilir. Bu yönteme yapılan diğer çağrılar geçersizdir ve başarısız olur.
GetStack '
GetStack yöntemi, geçerli çağrı yığınını kesme konumunda alır. Bu yöntem yalnızca betik hata ayıklayıcıya bölündiğinde çağrılabilir.
SetBreakpoint yöntemi betik içinde bir kesme noktası ayarlar. Uygulamanın, uygun bir kod konumuna ilerlemek için satır ve sütun konumlarını ayarlamakta serbest olduğunu unutmayın. Kesme noktasının yerleştirildiği gerçek satır ve sütun numaraları, döndürülen IDataModelScriptDebugBreakpoint arabirimindeki yöntem çağrıları tarafından alınabilir.
SetBreakpoint yöntemi aracılığıyla betik içinde oluşturulan her kesme noktasına uygulama tarafından benzersiz bir tanımlayıcı (64 bit işaretsiz tamsayı) atanır. FindBreakpointById yöntemi, belirli bir tanımlayıcıdan kesme noktasına arabirim almak için kullanılır.
EnumerateBreakpoints yöntemi, belirli bir betik içinde ayarlanan her kesme noktasını numaralandırabilen bir numaralandırıcı döndürür.
GetEventFilter yöntemi, belirli bir olay için "olayda kesme" özelliğinin etkinleştirilip etkinleştirilmediğini döndürür. "Olayda kesmeye" neden olabilen olaylar ScriptDebugEventFilter numaralandırmasının bir üyesi tarafından açıklanır.
SetEventFilter yöntemi, ScriptDebugEventFilter numaralandırmasının bir üyesi tarafından tanımlanan belirli bir olay için "olay kesme" davranışını değiştirir. GetEventFilter yönteminin belgelerinde kullanılabilir olayların tam listesi (ve bu numaralandırmanın açıklaması) bulunabilir.
StartDebugging yöntemi, belirli bir betik için hata ayıklayıcıyı "açar". Hata ayıklamayı başlatma eylemi, herhangi bir yürütme kesmesine veya adımlama işlemine etkin bir şekilde neden olmaz. Yalnızca betiği hata ayıklanabilir hale getirir ve istemcinin hata ayıklama arabirimiyle iletişim kurması için bir dizi arabirim sağlar.
StopDebugging yöntemi, hata ayıklamayı durdurmak isteyen bir istemci tarafından çağrılır. Bu yöntem çağrısı StartDebugging başarıyla yapıldıktan sonra herhangi bir noktada yapılabilir (örneğin: bir kesme sırasında, betik yürütülürken vb.). Çağrı, tüm hata ayıklama etkinliğini hemen durdurup StartDebugging çağrılmadan önceki durumuna geri sıfırlar.
Hata Ayıklama Arabirimini : IDataModelScriptDebugClient
Betik hata ayıklaması çevresinde bir arabirim sağlamak isteyen hata ayıklama ana bilgisayarı veya hata ayıklayıcısı uygulaması, betiğin hata ayıklama arabirimindeki StartDebugging yöntemi aracılığıyla betik hata ayıklayıcısına IDataModelScriptDebugClient arabiriminin bir uygulamasını sağlamalıdır.
IDataModelScriptDebugClient, hata ayıklama olaylarının geçirildiği ve denetimin betik yürütme altyapısından hata ayıklayıcı arabirimine geçtiği iletişim kanalıdır. Aşağıdaki gibi tanımlanır.
DECLARE_INTERFACE_(IDataModelScriptDebugClient, IUnknown)
{
STDMETHOD(NotifyDebugEvent)(_In_ ScriptDebugEventInformation *pEventInfo, _In_ IDataModelScript *pScript, _In_opt_ IModelObject *pEventDataObject, _Inout_ ScriptExecutionKind *resumeEventKind) PURE;
}
Betik hata ayıklayıcısına giren herhangi bir olay oluştuğunda, hata ayıklama kodunun kendisi NotifyDebugEvent yöntemi aracılığıyla arabirime bir çağrı yapar. Bu yöntem zaman uyumlu. Arabirim olaydan dönene kadar betiğin yürütülmesi sürdürülmeyecek. Betik hata ayıklayıcısının tanımı basit olması amaçlanmıştır: kesinlikle işleme gerektiren iç içe olay yoktur. Hata ayıklama olayı, ScriptDebugEventInformation olarak bilinen değişken kayıt tarafından tanımlanır. Olay bilgilerindeki hangi alanların geçerli olduğu büyük ölçüde DebugEvent üyesi tarafından tanımlanır. ScriptDebugEvent sabit listesi üyesi tarafından açıklandığı gibi gerçekleşen olay türünü tanımlar.
Çağrı Yığınını : IDataModelScriptDebugStack
Betik hata ayıklayıcısına giren bir olay oluştuğunda, hata ayıklama arabirimi kesme konumu için çağrı yığınını almak ister. Bu, GetStack yöntemi aracılığıyla yapılır. Bu yığın, aşağıda gösterildiği gibi tanımlanan IDataModelScriptDebugStack ile ifade edilir.
Genel yığının birden çok betik ve/veya birden çok betik sağlayıcısına yayılabileceğini unutmayın. Belirli bir betiğin hata ayıklama arabiriminde GetStack yöntemine yapılan tek bir çağrıdan döndürülen çağrı yığını, yalnızca bu betiğin sınırları içinde çağrı yığınının kesimini döndürmelidir. Aynı sağlayıcının iki betiği etkileşim kurarsa, bir betik hata ayıklama altyapısının çağrı yığınını birden çok betik bağlamını kapsadığını varsayabilmesi tamamen mümkündür. GetStack yöntemi, yığının başka bir betikteki bölümünü döndürmemelidir. Bunun yerine, bu durum algılanabilirse, betikte sınır çerçevesi olan yığın çerçevesi, bu yığın çerçevesindeKi isTransitionPoint ve GetTransition yöntemlerinin bir uygulaması aracılığıyla kendisini bir geçiş çerçevesi olarak işaretlemelidir. Hata ayıklayıcı arabiriminin, mevcut birden çok yığın kesiminden genel yığını bir araya getirmesi beklenir.
Geçişlerin bu şekilde uygulanması veya hata ayıklama arabiriminin yerel değişkenler, parametreler, kesme noktaları ve diğer betiklere özgü yapılar hakkındaki sorguları yanlış betik bağlamı için yönlendirmesi şarttır! Bu, hata ayıklayıcı arabiriminde tanımsız davranışa neden olur.
DECLARE_INTERFACE_(IDataModelScriptDebugStack, IUnknown)
{
STDMETHOD_(ULONG64, GetFrameCount)() PURE;
STDMETHOD(GetStackFrame)(_In_ ULONG64 frameNumber, _COM_Outptr_ IDataModelScriptDebugStackFrame **stackFrame) PURE;
}
GetFrameCount yöntemi, çağrı yığınının bu kesimindeki yığın çerçevelerinin sayısını döndürür. Sağlayıcı farklı betik bağlamlarındaki veya farklı sağlayıcılardaki çerçeveleri algılayabilirse, bu yığın segmentine giriş çerçevesinde IsTransitionPoint ve GetTransition yöntemlerini uygulayarak bunu çağırana göstermelidir.
GetStackFrame, yığın kesiminden belirli bir yığın çerçevesi alır. Çağrı yığını sıfır tabanlı bir dizin oluşturma sistemine sahiptir: kesme olayının gerçekleştiği geçerli yığın çerçevesi 0 çerçevesidir. Geçerli yöntemin çağıranı çerçeve 1'dir (vb.).
Kesildiğinde Durumu inceleme: IDataModelScriptDebugStackFrame
Betik hata ayıklayıcısına bölündüğünde çağrı yığınının belirli bir çerçevesi, kesmenin oluştuğu yığın kesimini temsil eden IDataModelScriptDebugStack arabirimindeki GetStackFrame yöntemine yapılan bir çağrı aracılığıyla alınabilir. Bu çerçeveyi temsil etmek için döndürülen IDataModelScriptDebugStackFrame arabirimi aşağıdaki gibi tanımlanır.
DECLARE_INTERFACE_(IDataModelScriptDebugStackFrame, IUnknown)
{
STDMETHOD(GetName)(_Out_ BSTR *name) PURE;
STDMETHOD(GetPosition)(_Out_ ScriptDebugPosition *position, _Out_opt_ ScriptDebugPosition *positionSpanEnd, _Out_opt_ BSTR *lineText) PURE;
STDMETHOD(IsTransitionPoint)(_Out_ bool *isTransitionPoint) PURE;
STDMETHOD(GetTransition)(_COM_Outptr_ IDataModelScript **transitionScript, _Out_ bool *isTransitionContiguous) PURE;
STDMETHOD(Evaluate)(_In_ PCWSTR pwszExpression, _COM_Outptr_ IModelObject **ppResult) PURE;
STDMETHOD(EnumerateLocals)(_COM_Outptr_ IDataModelScriptDebugVariableSetEnumerator **variablesEnum) PURE;
STDMETHOD(EnumerateArguments)(_COM_Outptr_ IDataModelScriptDebugVariableSetEnumerator **variablesEnum) PURE;
}
GetName yöntemi, bu çerçevenin görünen adını (örn. işlev adı) döndürür. Bu ad, hata ayıklayıcı arabiriminde kullanıcıya sunulan yığın geri izlemesinde görüntülenir.
GetPosition yöntemi, yığın çerçevesiyle temsil edilen betik içindeki konumu döndürür. Bu yöntem yalnızca betik, bu çerçevenin bulunduğu yığın tarafından temsil edilen bir kesme içinde olduğunda çağrılabilir. Bu çerçeve içindeki çizgi ve sütun konumu her zaman döndürülür. Hata ayıklayıcı betik içindeki "yürütme konumunun" aralığını döndürebiliyorsa positionSpanEnd bağımsız değişkeninde bir bitiş konumu döndürülebilir. Hata ayıklayıcı bunu yapamayabilirse, yayılma ucundaki satır ve sütun değerleri (istenirse) sıfır olarak ayarlanmalıdır.
IDataModelScriptDebugStack arabirimi, bir çağrı yığınının bir bölümünü temsil eder. Bu bölüm, çağrı yığınının bir betik bağlamında yer alır. Hata ayıklayıcısı bir betikten diğerine (veya bir betik sağlayıcısından diğerine) geçişi algılayabiliyorsa, IsTransitionPoint yöntemini uygulayarak ve uygun şekilde true veya false döndürerek bunu gösterebilir. Segmentin uygulandığı betiği giren çağrı yığını çerçevesi bir geçiş noktası olarak kabul edilmelidir. Diğer tüm çerçeveler değildir.
Belirli bir yığın çerçevesi IsTransition yöntemi tarafından belirlenen bir geçiş noktasıysa (geçiş noktalarının tanımı için buradaki belgelere bakın), GetTransition yöntemi geçişle ilgili bilgileri döndürür. Özellikle bu yöntem, bu IDataModelScriptDebugStackFrame'i içeren yığın kesimi tarafından temsil edilen betikte çağrı yapan önceki betiği döndürür.
Evaluate yöntemi, bu yöntemin çağrıldığı IDataModelScriptDebugStackFrame arabirimi tarafından temsil edilen yığın çerçevesi bağlamında bir ifadeyi (betik sağlayıcısının dili) değerlendirir. İfade değerlendirmesinin sonucu, betik sağlayıcısından IModelObject olarak sıralanmalıdır. Sonuçta elde edilen IModelObject üzerindeki özelliklerin ve diğer yapıların, hata ayıklayıcı kesme durumundayken alınabilmesi gerekir.
EnumerateLocals yöntemi, bu yöntemin çağrıldığı IDataModelScriptDebugStackFrame arabirimi tarafından temsil edilen yığın çerçevesi bağlamında kapsamda yer alan tüm yerel değişkenler için bir değişken kümesi (IDataModelScriptDebugVariableSetEnumerator arabirimiyle temsil edilir) döndürür.
EnumerateArguments yöntemi, bu yöntemin çağrıldığı IDataModelScriptDebugStackFrame arabirimi tarafından temsil edilen yığın çerçevesinde çağrılan işlevin tüm işlev bağımsız değişkenleri için bir değişken kümesi (IDataModelScriptDebugVariableSetEnumerator arabirimiyle gösterilir) döndürür.
Değişkenlere Bakma: IDataModelScriptDebugVariableSetEnumerator
Hata ayıklanan betikteki bir dizi değişken (belirli bir kapsamdakiler, bir işlevin yerel değerleri, işlevin bağımsız değişkenleri vb.) IDataModelScriptDebugVariableSetEnumerator arabirimi aracılığıyla tanımlanan bir değişken kümesiyle temsil edilir:
DECLARE_INTERFACE_(IDataModelScriptDebugVariableSetEnumerator, IUnknown)
{
STDMETHOD(Reset)() PURE;
STDMETHOD(GetNext)(_Out_ BSTR *variableName, _COM_Outptr_opt_ IModelObject **variableValue, _COM_Outptr_opt_result_maybenull_ IKeyStore **variableMetadata) PURE;
}
Reset yöntemi, numaralandırıcının oluşturma işleminden hemen sonraki konumunu (kümenin ilk öğesinden önce) sıfırlar.
GetNext yöntemi numaralandırıcıyı kümedeki bir sonraki değişkene taşır ve değişkenin adını, değerini ve onunla ilişkili tüm meta verileri döndürür. Numaralandırıcı kümenin sonuna geldiyse, hata E_BOUNDS döndürülür. getNext yönteminden E_BOUNDS işaretçisi döndürüldükten sonra, araya girilmiş bir Sıfırlama çağrısı yapılmadığı sürece yeniden çağrıldığında E_BOUNDS üretmeye devam eder.
Kesme Noktaları: IDataModelScriptDebugBreakpoint
Betik kesme noktaları, belirli bir betiğin hata ayıklama arabiriminde SetBreakpoint yöntemi aracılığıyla ayarlanır. Bu tür kesme noktaları hem benzersiz bir kimlikle hem de aşağıdaki gibi tanımlanan IDataModelScriptDebugBreakpoint arabiriminin bir uygulamasıyla temsil edilir.
DECLARE_INTERFACE_(IDataModelScriptDebugBreakpoint, IUnknown)
{
STDMETHOD_(ULONG64, GetId)() PURE;
STDMETHOD_(bool, IsEnabled)() PURE;
STDMETHOD_(void, Enable)() PURE;
STDMETHOD_(void, Disable)() PURE;
STDMETHOD_(void, Remove)() PURE;
STDMETHOD(GetPosition)(_Out_ ScriptDebugPosition *position, _Out_opt_ ScriptDebugPosition *positionSpanEnd, _Out_opt_ BSTR *lineText) PURE;
}
GetId yöntemi, betik sağlayıcısının hata ayıklama altyapısı tarafından kesme noktasına atanan benzersiz tanımlayıcıyı döndürür. Bu tanımlayıcı, içeren betik bağlamında benzersiz olmalıdır. Kesme noktası tanımlayıcısı sağlayıcı için benzersiz olabilir; ancak bu gerekli değildir.
IsEnabled yöntemi kesme noktasının etkinleştirilip etkinleştirilmediğini döndürür. Devre dışı bırakılmış bir kesme noktası hala var ve betiğin kesme noktaları listesinde yer alıyor, yalnızca geçici olarak "kapatılıyor". Tüm kesme noktaları etkin durumda oluşturulmalıdır.
Enable yöntemi kesme noktasını etkinleştirir. Kesme noktası devre dışı bırakıldıysa, bu yöntem çağrıldıktan sonra "kesme noktasına isabet etmesi" hata ayıklayıcıda bir kesmeye neden olur.
Disable yöntemi kesme noktasını devre dışı bırakır. Bu çağrıdan sonra, bu yöntem çağrıldıktan sonra "kesme noktasına basmak" hata ayıklayıcıya bölünmeyecek. Kesme noktası hala mevcutken "kapalı" olarak kabul edilir.
Remove yöntemi, kesme noktasını içeren listesinden kaldırır. Bu yöntem döndürdüğünde kesme noktası artık sembolik olarak mevcut değildir. Kesme noktasını temsil eden IDataModelScriptDebugBreakpoint arabirimi, çağrıdan sonra yalnız bırakılmış olarak kabul edilir. Bu çağrıdan sonra bu aramadan sonra bununla ilgili olarak serbest bırakmaktan başka hiçbir şey (yasal olarak) yapılamaz.
GetPosition yöntemi, betik içindeki kesme noktasının konumunu döndürür. Betik hata ayıklayıcısı, kesme noktasının bulunduğu kaynak kodun içinde satırı ve sütunu döndürmelidir. Bunu yapabiliyorsa, positionSpanEnd bağımsız değişkeni tarafından tanımlanan bir bitiş konumunu doldurarak kesme noktası tarafından temsil edilen bir kaynak aralığı da döndürebilir. Hata ayıklayıcı bu yayılma alanını oluşturamıyorsa ve çağıran bunu isterse, yayılma alanının bitiş konumunun Satır ve Sütun alanları değerlerin sağlanamayacağını belirten sıfır olarak doldurulmalıdır.
Kesme Noktası Numaralandırması: IDataModelScriptDebugBreakpointEnumerator
Bir betik sağlayıcısı hata ayıklamayı destekliyorsa, her betikle ilişkili tüm kesme noktalarını da izlemesi ve bu kesme noktalarını hata ayıklama arabirimine numaralandırabilmesi gerekir. Kesme noktaları için numaralandırıcı, belirli bir betiğin hata ayıklama arabirimindeki EnumerateBreakpoints yöntemi aracılığıyla alınır ve aşağıdaki gibi tanımlanır.
DECLARE_INTERFACE_(IDataModelScriptDebugBreakpointEnumerator, IUnknown)
{
STDMETHOD(Reset)() PURE;
STDMETHOD(GetNext)(_COM_Outptr_ IDataModelScriptDebugBreakpoint **breakpoint) PURE;
}
Reset yöntemi numaralandırıcının konumunu numaralandırıcı oluşturulduktan hemen sonra olduğu konuma (yani ilk numaralandırılmış kesme noktasından önce) sıfırlar.
GetNext yöntemi numaralandırıcıyı numaralandırılacak bir sonraki kesme noktasına taşır ve bu kesme noktası için IDataModelScriptDebugBreakpoint arabirimini döndürür. Numaralandırıcı numaralandırmanın sonuna ulaştıysa E_BOUNDS döndürür. E_BOUNDS hatası oluşturulduktan sonra, Reset yöntemine bir araya gelen çağrı yapılmadığı sürece GetNext yöntemine yapılan sonraki çağrılar E_BOUNDS üretmeye devam eder.
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