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.
Toto téma popisuje, jak používat skriptování datového modelu Ladicího programu C++ ladicího programu ladicího programu pro podporu automatizace s modulem ladicího programu pomocí skriptování.
správa skriptů v datovém modelu ladicího programu
Kromě role Správce datového modelu jako centrální autorita při vytváření a rozšiřitelnosti objektů je také zodpovědná za správu abstraktního konceptu skriptů. Z pohledu části Správce skriptů Ve Správci datových modelů je skript něco, co se dá dynamicky načíst, uvolnit a potenciálně ladit zprostředkovatelem, aby bylo možné rozšířit nebo poskytnout nové funkce datového modelu.
Zprostředkovatel skriptu je komponenta, která přemostí jazyk (např. NatVis, JavaScript atd.) na datový model. Zaregistruje jednu nebo více přípon souborů (např. ". NatVis", ".js"), které poskytovatel zpracovává, což umožňuje klientovi ladicího programu nebo uživatelskému rozhraní umožnit načítání souborů skriptů s tímto konkrétním rozšířením delegováním zprostředkovateli.
Správce základních skriptů: IDataModelScriptManager
Základní rozhraní správce skriptů je definováno následujícím způsobem.
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;
}
Metoda GetDefaultNameBinder vrátí výchozí vazbu názvu skriptu datového modelu. Pořadač názvů je komponenta, která překládá název v kontextu objektu. Například vzhledem k výrazu "foo.bar", je volána vazbu názvů k překladu názvového řádku v kontextu objektu foo. Pořadač vrácený zde se řídí sadou výchozích pravidel pro datový model. Zprostředkovatelé skriptů můžou tento pořadač použít k zajištění konzistence překladu názvů mezi zprostředkovateli.
Metoda RegisterScriptProvider informuje datový model, že existuje nový zprostředkovatel skriptu, který je schopen přemostění nového jazyka do datového modelu. Při volání této metody správce skriptů okamžitě zavolá daného zprostředkovatele skriptu a inquire o vlastnostech skriptů, které spravuje. Pokud již existuje zprostředkovatel zaregistrovaný pod názvem nebo příponou souboru, který daný zprostředkovatel skriptu označuje, tato metoda selže. Jako obslužnou rutinu pro konkrétní název nebo příponu souboru je možné zaregistrovat pouze jednoho zprostředkovatele skriptu.
UnregisterScriptProvider metoda vrátí volání RegisterScriptProvider metoda. Název a přípona souboru poskytnuté poskytovatelem inpassovaného skriptu už k němu nebudou přidruženy. Je důležité si uvědomit, že i po zrušení registrace může existovat velký počet nevyřízených odkazů modelu COM na poskytovatele skriptu. Tato metoda brání pouze načítání a vytváření skriptů typu, který daný zprostředkovatel skriptů spravuje. Pokud je skript načtený tímto poskytovatelem stále načtený nebo manipuloval s objektovým modelem ladicího programu (nebo datového modelu), mohou tyto manipulace stále obsahovat odkazy zpět do skriptu. Mohou existovat datové modely, metody nebo objekty, které přímo odkazují na konstrukty ve skriptu. Poskytovatel skriptů musí být připravený k tomu, aby se s tím vypořádat.
Metoda FindProviderForScriptType hledá správce skriptů pro zprostředkovatele, který má řetězec typu skriptu, jak je uvedeno v této metodě. Pokud ji nelze najít, tato metoda selže; v opačném případě se volajícímu vrátí poskytovatel skriptu.
EnumerateScriptProviders metoda vrátí enumerátor, který vytvoří výčet každého zprostředkovatele skriptu, který byl registrován ve správci skriptů prostřednictvím předchozího volání RegisterScriptProvider metody.
výčet zprostředkovatele skriptu: IDataModelScriptProviderEnumerator
EnumerateScriptProviders metoda vrátí enumerátor následujícího formuláře:
DECLARE_INTERFACE_(IDataModelScriptProviderEnumerator, IUnknown)
{
STDMETHOD(Reset)() PURE;
STDMETHOD(GetNext)(_COM_Outptr_ IDataModelScriptProvider **provider) PURE;
}
Metoda Reset přesune enumerátor na pozici, na které byl před vrácením prvního prvku.
Metoda GetNext přesune enumerátor vpřed jeden prvek a vrátí zprostředkovatele skriptu, který je v daném prvku. Když enumerátor dosáhne konce výčtu, E_BOUNDS se vrátí. Volání metody GetNext po přijetí této chyby bude nadále vracet E_BOUNDS neomezeně dlouho.
rozhraní hostitele datového modelu Ladicího programu C++ pro skriptování
role hostitele ve skriptovacím
Hostitel ladění zveřejňuje řadu velmi nízkých rozhraní pro pochopení povahy systému ladění cílů ladění, vyhodnocování výrazů v jazyce cílů ladění atd. Za normálních okolností se nejedná o konstruktory vyšší úrovně, jako je skriptování. To je ponecháno na celkové aplikaci ladicího programu nebo rozšíření, která tyto možnosti poskytují. Existuje však výjimka. Každý hostitel ladění, který se chce podílet na celkovém skriptovacím prostředí poskytovaném datovým modelem, musí implementovat několik jednoduchých rozhraní pro poskytování kontextů skriptům. Hostitel ladění je vlastně ve správě toho, kde chce skriptovací prostředí umístit funkce a další funkce poskytované skripty v rámci oboru názvů datového modelu. Zapojení do tohoto procesu umožňuje hostiteli povolit (nebo ne) použití takových funkcí například v vyhodnocovače výrazů. Rozhraní, která se týkají z pohledu hostitele, jsou následující:
| Rozhraní | Popis |
|---|---|
| IDebugHostScriptHost | Rozhraní, které označuje schopnost hostitele ladění, která se účastní skriptovacího prostředí. Toto rozhraní umožňuje vytvářet kontexty, které informují skriptovací moduly o tom, kam umístit objekty. |
| IDataModelScriptHostContext | Hostitelské rozhraní, které poskytovatel skriptu používá jako kontejner pro obsah skriptu. Obsah jiné plochy skriptu než manipulace, které provádí s objektovým modelem aplikace ladicího programu, je až do konkrétního hostitele ladění. Toto rozhraní umožňuje poskytovateli skriptu získat informace o tom, kam má umístit jeho obsah. Další informace najdete v tématu rozhraní skriptování C++ datového modelu dále v tomto tématu. |
hostitele skriptu hostitele ladění: IDebugHostScriptHost
Rozhraní IDebugHostScriptHost je rozhraní používané poskytovatelem skriptu k získání kontextu z hostitele ladění pro nově vytvořený skript. Tento kontext zahrnuje objekt (poskytovaný hostitelem ladění), kde zprostředkovatel skriptu může umístit jakékoli mosty mezi datovým modelem a skriptovacím prostředím. Takové mosty můžou být například metody datového modelu, které vyvolávají funkce skriptu. Tím umožníte volajícímu na straně datového modelu vyvolat metody skriptu pomocí metody Call v rozhraní IModelMethod.
Rozhraní IDebugHostScriptHost je definováno následujícím způsobem.
DECLARE_INTERFACE_(IDebugHostScriptHost, IUnknown)
{
STDMETHOD(CreateContext)(_In_ IDataModelScript* script, _COM_Outptr_ IDataModelScriptHostContext** scriptContext) PURE;
}
CreateContext metoda je volána zprostředkovatel skriptu vytvořit nový kontext, do kterého umístit obsah skriptu. Tento kontext je reprezentován rozhraním IDataModelScriptHostContext, které je podrobně popsáno na stránce Skriptovací rozhraní C++ datového modelu.
rozhraní skriptování datového modelu C++ ladicího programu
skriptování a skriptovací rozhraní
Celková architektura datového modelu umožňuje třetí straně definovat most mezi určitým jazykem a objektovým modelem datového modelu. Přemostění jazyka je obvykle skriptovací jazyk, protože prostředí datového modelu je velmi dynamické. Komponenta, která definuje a implementuje tento most mezi jazykem a objektovým modelem datového modelu, se nazývá zprostředkovatel skriptu. Při inicializaci se poskytovatel skriptů zaregistruje do části správce datového modelu a libovolného rozhraní, které spravuje rozšiřitelnost, následně umožní úpravy, načítání, uvolňování a potenciálně ladění skriptů zapsaných do jazyka, který spravuje poskytovatel skriptů.
Všimněte si, že nástroje pro ladění pro Windows v současnosti definují dva zprostředkovatele skriptů.
- Zprostředkovatel NatVis. Tento zprostředkovatel je vložený do DbgEng.dll a mostů mezi XML a datovými modely NatVis, což umožňuje vizualizaci datových typů nativních a jazykových.
- Zprostředkovatel JavaScriptu. Tento zprostředkovatel je součástí staršího rozšíření ladicího programu: JsProvider.dll. Přemostí mezi skripty napsané v jazyce JavaScript a datovým modelem, což umožňuje libovolnou formu ovládacího prvku a rozšiřitelnosti ladicího programu.
Noví zprostředkovatelé lze napsat, které přemístit jiné jazyky (např. Python atd.) do datového modelu. Takové by se v současnosti zapouzdřovaly ve starších rozšířeních ladicího programu pro účely načítání. Samotný poskytovatel skriptů by měl minimalizovat závislost se staršími rozhraními modulu a měl by využívat pouze rozhraní API datového modelu, pokud je to možné. To umožní, aby poskytovatel byl přenositelný do jiných prostředí s výrazně větší jednoduchostí.
Existují dvě třídy rozhraní souvisejících se zprostředkovateli skriptů. První třídou rozhraní je obecná správa poskytovatelů skriptů a skriptů, které spravují. Druhá třída rozhraní je určená pro podporu ladění skriptů. I když je podpora první sady povinná, podpora druhé sady je volitelná a nemusí dávat smysl pro každého zprostředkovatele.
Obecná rozhraní pro správu:
| Rozhraní | Popis |
|---|---|
| IDataModelScriptProvider | Základní rozhraní, které musí implementovat poskytovatel skriptu. Toto je rozhraní, které je registrováno v části správce skriptů správce datového modelu, aby bylo možné inzerovat podporu poskytovatele konkrétního typu skriptu a zaregistrovat se v konkrétní příponě souboru. |
| IDataModelScript | Abstrakce konkrétního skriptu, který je spravován poskytovatelem. Každý skript, který se načte nebo upravuje, má samostatnou instanci IDataModelScriptu. |
| IDataModelScriptClient | Klientské rozhraní, které poskytovatel skriptů používá k předávání informací do uživatelského rozhraní. Zprostředkovatelé skriptů toto rozhraní neimplementují. Aplikace hostující datový model, který chce využít poskytovatele skriptů, dělá. Zprostředkovatel skriptu bude volat metody klienta skriptu pro hlášení stavu, chyb atd. |
| IDataModelScriptHostContext | Hostitelské rozhraní, které poskytovatel skriptu používá jako kontejner pro obsah skriptu. Obsah jiné plochy skriptu než manipulace, které provádí s objektovým modelem aplikace ladicího programu, je až do konkrétního hostitele ladění. Toto rozhraní umožňuje poskytovateli skriptu získat informace o tom, kam má umístit jeho obsah. |
| IDataModelScriptTemplate | Poskytovatelé skriptů můžou poskytovat jednu nebo více šablon, které slouží jako výchozí body pro uživatele, kteří můžou vytvářet skripty. Aplikace ladicího programu, která poskytuje integrovaný editor, může předem vyplňovat nové skripty s obsahem šablony, který je inzerován poskytovatelem prostřednictvím tohoto rozhraní. |
| IDataModelScriptTemplateEnumerator | Rozhraní enumerátoru, které poskytovatel skriptů implementuje, aby inzerovaly všechny různé šablony, které podporuje. |
| IDataModelNameBinder | Pořadač názvů – objekt, který může přidružit název v kontextu k hodnotě. U daného výrazu, jako je například "foo.bar", může pořadač názvů svázat název "pruh" v kontextu objektu "foo" a vytvořit hodnotu nebo odkaz na něj. Zprostředkovatel skriptu obvykle neimplementuje názvové pořadače; místo toho lze výchozí pořadač získat z datového modelu a použít zprostředkovatel skriptu. |
Ladicí rozhraní jsou:
| Rozhraní | Popis |
|---|---|
| IDataModelScriptDebug | Základní rozhraní, které musí poskytovatel skriptu poskytnout, aby byl skript laditelný. Třída implementace rozhraní IDataModelScript musí QueryInterface pro IDataModelScriptDebug, pokud je skript debuggable. |
| IDataModelScriptDebugClient | Uživatelské rozhraní, které chce poskytnout schopnost ladění skriptů implementuje rozhraní IDataModelScriptDebugClient. Zprostředkovatel skriptu toto rozhraní využívá k předávání informací o ladění (např. události, ke kterým dochází, zarážky atd.) |
| IDataModelScriptDebugStack | Zprostředkovatel skriptu implementuje toto rozhraní, aby zpřístupnil koncept zásobníku volání ladicímu programu skriptu. |
| IDataModelScriptDebugStackFrame | Zprostředkovatel skriptů implementuje toto rozhraní, aby v rámci zásobníku volání zpřístupnil pojem konkrétního rámce zásobníku. |
| IDataModelScriptDebugVariableSetEnumerator | Zprostředkovatel skriptů implementuje toto rozhraní pro zveřejnění sady proměnných. Tato sada může představovat sadu parametrů pro funkci, sadu místních proměnných nebo sadu proměnných v určitém oboru. Přesný význam závisí na tom, jak bylo rozhraní získáno. |
| IDataModelScriptDebugBreakpoint | Zprostředkovatel skriptů implementuje toto rozhraní, které zveřejňuje pojem a kontrolu konkrétní zarážky v rámci skriptu. |
| IDataModelScriptDebugBreakpointEnumerator | Zprostředkovatel skriptu to implementuje k vytvoření výčtu všech zarážek, které aktuálně existují v rámci skriptu (bez ohledu na to, zda je povoleno nebo ne). |
zprostředkovatele základních skriptů: IDataModelScriptProvider
Jakékoli rozšíření, které chce být zprostředkovatelem skriptu, musí poskytovat implementaci rozhraní IDataModelScriptProvider a zaregistrovat takové část správce skriptů správce datového modelu prostřednictvím Metody RegisterScriptProvider. Toto základní rozhraní, které musí být implementováno, je definováno následujícím způsobem.
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;
}
Metoda GetName vrátí název typu (nebo jazyk) skriptů, které zprostředkovatel spravuje jako řetězec přidělený metodou SysAllocString. Volající zodpovídá za uvolnění vráceného řetězce přes SysFreeString. Příklady řetězců, které mohou být vráceny z této metody, jsou "JavaScript" nebo "NatVis". Vrácený řetězec se pravděpodobně zobrazí v uživatelském rozhraní aplikace ladicího programu, která je hostitelem datového modelu. Žádné dva zprostředkovatelé skriptů nemusí vrátit stejný název (nerozlišují malá a velká písmena).
Metoda GetExtension vrátí příponu souboru pro skripty spravované tímto zprostředkovatelem (bez tečky) jako řetězec přidělený metodou SysAllocString. Aplikace ladicího programu hostující datový model (s podporou skriptování) deleguje otevírání souborů skriptu s tímto rozšířením na poskytovatele skriptu. Volající zodpovídá za uvolnění vráceného řetězce přes SysFreeString. Příklady řetězců, které mohou být vráceny z této metody, jsou "js" nebo "NatVis".
Metoda CreateScript je volána k vytvoření nového skriptu. Zprostředkovatel skriptu musí vrátit nový a prázdný skript reprezentovaný vráceným rozhraním IDataModelScript při každém zavolání této metody. Všimněte si, že tato metoda se volá bez ohledu na to, zda uživatelské rozhraní vytváří nový prázdný skript pro úpravy uživatelem nebo zda aplikace ladicího programu načítá skript z disku. Poskytovatel se nezabíná do vstupně-výstupních operací souborů. Zpracovává pouze požadavky z hostitelské aplikace prostřednictvím datových proudů předávaných metodám v IDataModelScriptu.
Metoda GetDefaultTemplateContent vrátí rozhraní pro výchozí obsah šablony zprostředkovatele. Jedná se o obsah, který by poskytovatel skriptu chtěl předvyplnět v okně pro úpravy nově vytvořeného skriptu. Pokud zprostředkovatel skriptu nemá žádné šablony (nebo nemá žádný obsah šablony, který je určen jako výchozí obsah), může poskytovatel skriptu vrátit E_NOTIMPL z této metody.
EnumerateTemplates metoda vrátí enumerátor, který je schopen vytvořit výčet různých šablon, které jsou poskytovány poskytovatelem skriptu. Obsah šablony je to, co poskytovatel skriptu chce při vytváření nového skriptu "předvyplnit" do okna pro úpravy. Pokud je podporováno více různých šablon, můžete tyto šablony pojmenovat (např. "Imperativní skript", "Rozšiřující skript") a aplikace ladicího programu, která je hostitelem datového modelu, zvolit, jak uživateli prezentovat "šablony".
rozhraní základních skriptů: IDataModelScript
Hlavní rozhraní, které spravuje jednotlivé skripty implementované poskytovatelem, je IDataModelScript rozhraní. Komponenta, která implementuje toto rozhraní, se vrátí, když klient chce vytvořit nový prázdný skript a zavolá CreateScript metoda na IDataModelScriptProvider.
Každý skript vytvořený poskytovatelem by měl být v nezávislém silu. Jeden skript by neměl mít vliv na jiný skript s výjimkou explicitní interakce s externími objekty prostřednictvím datového modelu. Dva skripty můžou například rozšířit určitý typ nebo koncept (např. pojem ladicího programu o tom, co je proces). Každý skript pak může přistupovat k polím mezi sebou prostřednictvím objektu externího procesu.
Rozhraní je definováno následujícím způsobem.
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;
}
Metoda GetName vrátí název skriptu jako přidělený řetězec prostřednictvím SysAllocString funkce. Pokud skript ještě nemá název, metoda by měla vrátit hodnotu null BSTR. V této situaci by nemělo selhat. Pokud je skript explicitně přejmenován prostřednictvím volání metody Rename, metoda GetName by měla vrátit nově přiřazený název.
Metoda Rename přiřadí skriptu nový název. Je zodpovědností implementace skriptu uložit tento název a vrátit ho při každém volání GetName metoda. To se často volá, když se uživatelské rozhraní rozhodne uložit jako skript na nový název. Upozorňujeme, že přejmenování skriptu může mít vliv na to, kde se hostitelská aplikace rozhodne projektovat obsah skriptu.
Klient volá metodu Populate, aby mohl změnit nebo synchronizovat "obsah" skriptu. Jedná se o oznámení poskytovatele skriptu, že se změnil kód skriptu. Je důležité si uvědomit, že tato metoda nezpůsobí spuštění skriptu ani změny žádného objektu, který skript manipuluje. Jedná se pouze o oznámení poskytovatele skriptu, že se obsah skriptu změnil, aby mohl synchronizovat vlastní vnitřní stav.
Metoda Execute spustí obsah skriptu podle posledního úspěšného volání Naplnění a upraví objektový model ladicího programu podle tohoto obsahu. Pokud jazyk (nebo zprostředkovatel skriptu) definuje "hlavní funkci" – ta, kterou by autor chtěl při kliknutí na imaginární tlačítko Spustit skript v uživatelském rozhraní – taková "hlavní funkce" není volána během operace spuštění. Operaci Spuštění je možné považovat pouze za provádění inicializace a manipulace s objektem modelu (např. spuštění kořenového kódu a nastavení bodů rozšiřitelnosti).
Metoda Unlink vrátí operaci Execute. Všechny manipulace s objekty nebo body rozšiřitelnosti vytvořené během provádění skriptu se vrátí zpět. Po operaci Zrušení propojení může být skript znovu spuštěn prostřednictvím volání provést nebo může být vydán.
IsInvocable metoda vrátí, zda je skript vyvolán -- to znamená, zda má "main function" definovaný jeho jazykem nebo poskytovatelem. Taková "hlavní funkce" je koncepčně něco, co by autor skriptu chtěl volat, pokud bylo v uživatelském rozhraní stisknuto imaginární tlačítko Spustit skript.
Pokud má skript "hlavní funkci", která je určena ke spuštění z vyvolání uživatelského rozhraní, označuje takové prostřednictvím true return z IsInvocable metoda. Uživatelské rozhraní pak může volat InvokeMain metoda, aby skutečně "invoke" skript. Všimněte si, že se liší od Spuštění, který spouští veškerý kořenový kód a přemísní skript do oboru názvů základního hostitele.
**Klient skriptu: IDataModelScriptClient **
Aplikace, která je hostitelem datového modelu, který chce spravovat skripty a má uživatelské rozhraní (ať už grafické rozhraní nebo konzolu), v tomto smyslu implementuje rozhraní IDataModelScriptClient. Toto rozhraní se předává libovolnému poskytovateli skriptů během provádění nebo vyvolání nebo skriptu, aby se informace o chybách a událostech předávaly zpět do uživatelského rozhraní.
Rozhraní IDataModelScriptClient je definováno následujícím způsobem.
DECLARE_INTERFACE_(IDataModelScriptClient, IUnknown)
{
STDMETHOD(ReportError)(_In_ ErrorClass errClass, _In_ HRESULT hrFail, _In_opt_ PCWSTR message, _In_ ULONG line, _In_ ULONG position) PURE;
}
Pokud během provádění nebo vyvolání skriptu dojde k chybě, poskytovatel skriptu zavolá metodu ReportError, která upozorní uživatelské rozhraní na chybu.
kontext hostitele pro skript: IDataModelScriptHostContext
Hostitel ladění má nějaký vliv na to, jak a kde projektuje obsah skriptu datového modelu. Očekává se, že každý skript požádá hostitele o kontext, ve kterém umístí mosty do skriptu (např. objekty funkce, které lze volat atd.). Tento kontext se načte voláním Metody CreateContext na IDebugHostScriptHostHost a získání IDataModelScriptHostContext.
Rozhraní IDataModelScriptHostContext je definováno následujícím způsobem.
DECLARE_INTERFACE_(IDataModelScriptHostContext, IUnknown)
{
STDMETHOD(NotifyScriptChange)(_In_ IDataModelScript* script, _In_ ScriptChangeKind changeKind) PURE;
STDMETHOD(GetNamespaceObject)(_COM_Outptr_ IModelObject** namespaceObject) PURE;
}
Je nutné, aby poskytovatel skriptu upozorňovat hostitele ladění na určité operace, ke kterým došlo při volání metody NotifyScriptChange metody v přidruženém kontextu. Takové operace jsou definovány jako členy výčtu ScriptChangeKind.
GetNamespaceObject metoda vrátí objekt, do kterého může poskytovatel skriptu umístit jakékoli mosty mezi datový model a skript. Je zde například, že zprostředkovatel skriptu může umístit objekty metody datového modelu (IModelMethod rozhraní boxed do IModelObject), jejichž implementace volá odpovídající pojmenované funkce ve skriptu.
šablony pro nově vytvořené skripty: IDataModelScriptTemplate
Poskytovatelé skriptů, kteří chtějí prezentovat předem vyplněný obsah pro nové skripty (např. aby uživatelům pomohli psát skripty v uživatelském rozhraní ladicího programu), můžou k tomu použít jednu nebo více šablon skriptů. Tyto šablony jsou komponenty, které implementují IDataModelScriptTemplate rozhraní a jsou vráceny buď Metodou GetDefaultTemplate nebo EnumerateTemplates metoda u zprostředkovatele skriptu.
Rozhraní IDataModelScriptTemplate je definováno následujícím způsobem.
DECLARE_INTERFACE_(IDataModelScriptTemplate, IUnknown)
{
STDMETHOD(GetName)(_Out_ BSTR *templateName) PURE;
STDMETHOD(GetDescription)(_Out_ BSTR *templateDescription) PURE;
STDMETHOD(GetContent)(_COM_Outptr_ IStream **contentStream) PURE;
}
Metoda GetName vrátí název šablony. To může selhat s E_NOTIMPL, pokud šablona nemá název. Jedna výchozí šablona (pokud taková existuje) nemusí mít název. Všechny ostatní šablony jsou. Tyto názvy se můžou zobrazovat v uživatelském rozhraní jako součást nabídky pro výběr šablony, kterou chcete vytvořit.
Metoda GetDescription vrátí popis šablony. Tento popis by se uživateli zobrazil v popisnějších rozhraních, aby uživateli pomohl pochopit, co je šablona navržená. Šablona může vrátit E_NOTIMPL z této metody, pokud neobsahuje popis.
Metoda GetContent vrátí obsah (nebo kód) šablony. To je to, co by bylo předem vyplněné v okně pro úpravy, pokud se uživatel rozhodl vytvořit nový skript z této šablony. Šablona zodpovídá za vytvoření (a vrácení) standardního datového proudu přes obsah, který může klient vyžádat.
výčet obsahu šablony zprostředkovatele: IDataModelScriptTemplateEnumerator
Zprostředkovatel skriptu může poskytnout jednu nebo více šablon, které předem vyplní obsah do nově vytvořených skriptů v určitém uživatelském rozhraní. Pokud jsou k dispozici některé z těchto šablon, poskytovatel skriptu musí implementovat enumerátor nad nimi, který je vrácen při volání EnumerateTemplates metoda.
Takový enumerator je implementace IDataModelScriptTemplateEnumerator rozhraní a je definována následujícím způsobem.
DECLARE_INTERFACE_(IDataModelScriptTemplateEnumerator, IUnknown)
{
STDMETHOD(Reset)() PURE;
STDMETHOD(GetNext)(_COM_Outptr_ IDataModelScriptTemplate **templateContent) PURE;
}
Metoda Reset resetuje enumerátor na pozici, ve které byl poprvé vytvořen – před vytvořením první šablony.
Metoda GetNext přesune enumerátor do další šablony a vrátí ji. Na konci výčtu vrátí enumerátor E_BOUNDS. Po dosažení značky E_BOUNDS bude enumerátor pokračovat v vytváření E_BOUNDS chyb po neomezenou dobu, dokud se nevyvolá volání Reset.
překladu významu názvů: IDataModelNameBinder
Datový model poskytuje standardní způsob, jak poskytovatelé skriptů určit význam daného názvu v daném kontextu (např. určení pruhových prostředků pro foo.bar), který bude fungovat napříč různými poskytovateli skriptů. Tento mechanismus se označuje jako pořadač názvů a je reprezentován rozhraním IDataModelNameBinder. Takový pořadač zapouzdřuje sadu pravidel o tom, jak se název překládá a jak řešit konfliktní řešení, kde je název definován vícekrát u objektu. Součástí těchto pravidel jsou například to, jak se projektovaný název (přidaný datovým modelem) přeloží na nativní název (jeden v systému typů laděného jazyka).
Aby bylo možné zajistit určitou konzistenci mezi poskytovateli skriptů, správce skriptů datového modelu poskytuje výchozí vazbu názvů. Tento výchozí názvový pořadač lze získat voláním Metody GetDefaultNameBinder v rozhraní IDataModelScriptManager. Rozhraní názvového pořadače je definováno následujícím způsobem.
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 metoda provádí ekvivalent contextObject.name na daném objektu podle sady pravidel vazby. Výsledkem této vazby je hodnota. Jako hodnotu nemůže zprostředkovatel základního skriptu použít hodnotu k provedení přiřazení zpět k názvu.
BindReference metoda je podobná BindValue v tom, že také provádí ekvivalent contextObject.name na daném objektu podle sady pravidel vazby. Výsledkem vazby z této metody je však odkaz místo hodnoty. Jako referenci může zprostředkovatel skriptu použít odkaz k provedení přiřazení zpět k názvu.
EnumerateValues metoda enumeruje sadu názvů a hodnot, které budou vázány proti objektu podle pravidel BindValue metoda. Na rozdíl od EnumerateKeys, EnumerateValues a podobných metod v IModelObject, které mohou vrátit více názvů se stejnou hodnotou (pro základní třídy, nadřazené modely a podobně), tento enumerátor vrátí pouze konkrétní sadu názvů, které budou svázané s BindValue a BindReference. Názvy nebudou nikdy duplikovány. Všimněte si, že existuje výrazně vyšší náklady na vytvoření výčtu objektu prostřednictvím binderu názvů než volání metod IModelObject.
EnumerateReferences metoda enumeruje sadu názvů a odkazy na ně, které budou vázány proti objektu podle pravidel BindReference metoda. Na rozdíl od EnumerateKeys, EnumerateValues a podobných metod v IModelObject, které mohou vrátit více názvů se stejnou hodnotou (pro základní třídy, nadřazené modely a podobně), tento enumerátor vrátí pouze konkrétní sadu názvů, které budou svázané s BindValue a BindReference. Názvy nebudou nikdy duplikovány. Všimněte si, že existuje výrazně vyšší náklady na vytvoření výčtu objektu prostřednictvím binderu názvů než volání metod IModelObject.
rozhraní ladění datového modelu C++ ladicího programu
Infrastruktura pro poskytovatele skriptů v datovém modelu také poskytuje koncept týkající se ladění skriptů. Každý skript, který chce zpřístupnit možnosti ladění pro hostitele ladění a aplikace ladicího programu hostující datový model, to může provést díky tomu, že ladicí skripty implementují rozhraní IDataModelScriptDebug kromě rozhraní IDataModelScript. Přítomnost tohoto rozhraní ve skriptu označuje infrastrukturu, kterou je možné ladit.
IDataModelScriptDebug rozhraní je výchozím bodem pro získání přístupu k ladicím schopnostem zprostředkovatele skriptu, je připojena sadou dalších rozhraní, aby poskytovala celkové možnosti ladění.
Ladicí rozhraní jsou:
| Rozhraní | Popis |
|---|---|
| IDataModelScriptDebug | Základní rozhraní, které musí poskytovatel skriptu poskytnout, aby byl skript laditelný. Třída implementace rozhraní IDataModelScript musí QueryInterface pro IDataModelScriptDebug, pokud je skript debuggable. |
| IDataModelScriptDebugClient | Uživatelské rozhraní, které chce poskytnout schopnost ladění skriptů implementuje rozhraní IDataModelScriptDebugClient. Zprostředkovatel skriptu toto rozhraní využívá k předávání informací o ladění (např. události, ke kterým dochází, zarážky atd.) |
| IDataModelScriptDebugStack | Zprostředkovatel skriptu implementuje toto rozhraní, aby zpřístupnil koncept zásobníku volání ladicímu programu skriptu. |
| IDataModelScriptDebugStackFrame | Zprostředkovatel skriptů implementuje toto rozhraní, aby v rámci zásobníku volání zpřístupnil pojem konkrétního rámce zásobníku. |
| IDataModelScriptDebugVariableSetEnumerator | Zprostředkovatel skriptů implementuje toto rozhraní pro zveřejnění sady proměnných. Tato sada může představovat sadu parametrů pro funkci, sadu místních proměnných nebo sadu proměnných v určitém oboru. Přesný význam závisí na tom, jak bylo rozhraní získáno. |
| IDataModelScriptDebugBreakpoint | Zprostředkovatel skriptů implementuje toto rozhraní, které zveřejňuje pojem a kontrolu konkrétní zarážky v rámci skriptu. |
| IDataModelScriptDebugBreakpointEnumerator | Zprostředkovatel skriptu to implementuje k vytvoření výčtu všech zarážek, které aktuálně existují v rámci skriptu (bez ohledu na to, zda je povoleno nebo ne). |
Obecná rozhraní pro správu:
| Rozhraní | Popis |
|---|---|
| IDataModelScriptProvider | Základní rozhraní, které musí implementovat poskytovatel skriptu. Toto je rozhraní, které je registrováno v části správce skriptů správce datového modelu, aby bylo možné inzerovat podporu poskytovatele konkrétního typu skriptu a zaregistrovat se v konkrétní příponě souboru. |
| IDataModelScript | Abstrakce konkrétního skriptu, který je spravován poskytovatelem. Každý skript, který se načte nebo upravuje, má samostatnou instanci IDataModelScriptu. |
| IDataModelScriptClient | Klientské rozhraní, které poskytovatel skriptů používá k předávání informací do uživatelského rozhraní. Zprostředkovatelé skriptů toto rozhraní neimplementují. Aplikace hostující datový model, který chce využít poskytovatele skriptů, dělá. Zprostředkovatel skriptu bude volat metody klienta skriptu pro hlášení stavu, chyb atd. |
| IDataModelScriptHostContext | Hostitelské rozhraní, které poskytovatel skriptu používá jako kontejner pro obsah skriptu. Obsah jiné plochy skriptu než manipulace, které provádí s objektovým modelem aplikace ladicího programu, je až do konkrétního hostitele ladění. Toto rozhraní umožňuje poskytovateli skriptu získat informace o tom, kam má umístit jeho obsah. |
| IDataModelScriptTemplate | Poskytovatelé skriptů můžou poskytovat jednu nebo více šablon, které slouží jako výchozí body pro uživatele, kteří můžou vytvářet skripty. Aplikace ladicího programu, která poskytuje integrovaný editor, může předem vyplňovat nové skripty s obsahem šablony, který je inzerován poskytovatelem prostřednictvím tohoto rozhraní. |
| IDataModelScriptTemplateEnumerator | Rozhraní enumerátoru, které poskytovatel skriptů implementuje, aby inzerovaly všechny různé šablony, které podporuje. |
| IDataModelNameBinder | Pořadač názvů – objekt, který může přidružit název v kontextu k hodnotě. U daného výrazu, jako je například "foo.bar", může pořadač názvů svázat název "pruh" v kontextu objektu "foo" a vytvořit hodnotu nebo odkaz na něj. Zprostředkovatel skriptu obvykle neimplementuje názvové pořadače; Místo toho lze výchozí pořadač získat z datového modelu a použít zprostředkovatel skriptu. |
ladění skriptů: IDataModelScriptDebug
Jakýkoli skript, který je debuggable označuje tuto schopnost prostřednictvím přítomnosti IDataModelScriptDebug rozhraní na stejné komponentě, která implementuje IDataModelScript. Dotaz na toto rozhraní pomocí hostitele ladění nebo aplikace ladicího programu hostujícího datový model označuje přítomnost funkce ladění.
Rozhraní IDataModelScriptDebug je definováno následujícím způsobem.
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;
}
Metoda GetDebugState vrátí aktuální stav skriptu (např. zda se spouští nebo ne). Stav je definován hodnotou v rámci ScriptDebugState výčtu.
Metoda GetCurrentPosition vrátí aktuální pozici v rámci skriptu. To může být volána pouze v případě, že je skript rozdělen do ladicího programu, kde volání GetScriptState vrátí ScriptDebugBreak. Jakékoli jiné volání této metody je neplatné a selže.
Metoda GetStack získá aktuální zásobník volání na pozici přerušení. Tuto metodu lze volat pouze v případě, že je skript rozdělen do ladicího programu.
Metoda SetBreakpoint nastaví zarážku v rámci skriptu. Všimněte si, že implementace je volná pro úpravu umístění vstupního řádku a sloupce, aby se přesunula na odpovídající pozici kódu. Skutečná čísla řádků a sloupců, kde byla zarážka umístěna, lze načíst voláním metody vráceného rozhraní IDataModelScriptDebugBreakpoint.
Každá zarážka vytvořená v rámci skriptu pomocí metody SetBreakpoint má přiřazen jedinečný identifikátor (64bitové celé číslo bez znaménka) implementací. Metoda FindBreakpointById slouží k získání rozhraní k zarážce z daného identifikátoru.
výčtu breakpointů
EnumerateBreakpoints metoda vrátí enumerátor schopný vytvořit výčet každé zarážky, která je nastavena v rámci konkrétního skriptu.
Metoda GetEventFilter vrátí, zda je pro konkrétní událost povolená možnost "break on event". Události, které mohou způsobit přerušení události, jsou popsány členem ScriptDebugEventFilter výčtu.
Metoda SetEventFilter změní chování "break on event" pro konkrétní událost, jak je definováno členem ScriptDebugEventFilter výčtu. Úplný seznam dostupných událostí (a popis tohoto výčtu) najdete v dokumentaci k metodě GetEventFilter.
Metoda StartDebugging "zapne" ladicí program pro konkrétní skript. Spuštění ladění aktivně nezpůsobí přerušení provádění ani krokování. Stačí, aby byl skript laditelný a poskytuje sadu rozhraní pro komunikaci klienta s rozhraním ladění.
Metoda StopDebugging je volána klientem, který chce zastavit ladění. Toto volání metody může být provedeno v jakémkoli okamžiku po úspěšném spuštění ladění (např. během přerušení, zatímco se skript spouští atd.). Volání okamžitě ukončí veškerou aktivitu ladění a obnoví stav zpět před voláním spuštění ladění.
rozhraní ladění: IDataModelScriptDebugClient
Aplikace ladicího hostitele nebo ladicího programu, která chce poskytnout rozhraní týkající se ladění skriptů, musí poskytnout implementaci rozhraní IDataModelScriptDebugClient do ladicího programu skriptu prostřednictvím metody StartDebugging v ladicím rozhraní pro skript.
IDataModelScriptDebugClient je komunikační kanál, ve kterém se předávají události ladění a řízení přechází z modulu spouštění skriptu do rozhraní ladicího programu. Definuje se následujícím způsobem.
DECLARE_INTERFACE_(IDataModelScriptDebugClient, IUnknown)
{
STDMETHOD(NotifyDebugEvent)(_In_ ScriptDebugEventInformation *pEventInfo, _In_ IDataModelScript *pScript, _In_opt_ IModelObject *pEventDataObject, _Inout_ ScriptExecutionKind *resumeEventKind) PURE;
}
Kdykoli dojde k jakékoli události, která se rozdělí do ladicího programu skriptu, kód ladění sám provede volání rozhraní prostřednictvím NotifyDebugEvent metody. Tato metoda je synchronní. Spuštění skriptu nebude pokračovat, dokud se rozhraní nevrátí z události. Definice ladicího programu skriptu je určena jako jednoduchá: neexistují žádné vnořené události vyžadující zpracování. Událost ladění je definována záznamem variant, který se označuje jako ScriptDebugEventInformation. Která pole v informacích o události jsou platná, je z velké části definována členem DebugEvent. Definuje druh události, ke které došlo, jak popisuje člen ScriptDebugEvent výčtu.
zásobník volání: IDataModelScriptDebugStack
Když dojde k události, která se rozdělí do ladicího programu skriptu, rozhraní ladění bude chtít načíst zásobník volání pro umístění přerušení. To se provádí metodou GetStack. Takový zásobník je vyjádřen prostřednictvím IDataModelScriptDebugStack, který je definován, jak je uvedeno níže.
Všimněte si, že celkový zásobník může zahrnovat více skriptů a/nebo více zprostředkovatelů skriptů. Zásobník volání vrácený z jednoho volání GetStack metody v rozhraní ladění konkrétního skriptu by měl vrátit pouze segment zásobníku volání v mezích tohoto skriptu. Je zcela možné, že ladicí modul skriptu může načíst zásobník volání, protože zahrnuje více kontextů skriptu, pokud dva skripty stejného zprostředkovatele interagují. Metoda GetStack by neměla vracet část zásobníku, která je v jiném skriptu. Místo toho, pokud je možné tuto situaci zjistit, by měl rámec zásobníku, který je hraničním rámcem do skriptu, označit jako přechodový rámec prostřednictvím implementace IsTransitionPoint a GetTransition metody v tomto rámečku zásobníku. Očekává se, že rozhraní ladicího programu spojí celkový zásobník z více segmentů zásobníku, které existují.
Je nezbytné, aby přechody byly implementovány tímto způsobem nebo ladicí rozhraní může směrovat dotazy na místní proměnné, parametry, zarážky a další konstrukty specifické pro skripty do nesprávného kontextu skriptu! Výsledkem bude nedefinované chování v rozhraní ladicího programu.
DECLARE_INTERFACE_(IDataModelScriptDebugStack, IUnknown)
{
STDMETHOD_(ULONG64, GetFrameCount)() PURE;
STDMETHOD(GetStackFrame)(_In_ ULONG64 frameNumber, _COM_Outptr_ IDataModelScriptDebugStackFrame **stackFrame) PURE;
}
Metoda GetFrameCount vrátí počet rámců zásobníku v tomto segmentu zásobníku volání. Pokud zprostředkovatel dokáže rozpoznat rámce v různých kontextech skriptu nebo různých zprostředkovatelích, měl by to znamenat volajícímu implementací metod IsTransitionPoint a GetTransition na vstupním rámečku do tohoto segmentu zásobníku.
GetStackFrame získá konkrétní rámec zásobníku ze segmentu zásobníku. Zásobník volání má systém indexování založený na nule: aktuální rámec zásobníku, kde došlo k přerušení události, je rámec 0. Volající aktuální metody je rámec 1 (a tak dále).
zkoumání stavu při přerušení: IDataModelScriptDebugStackFrame
Konkrétní rámec zásobníku volání při rozdělení do ladicího programu skriptu lze načíst voláním GetStackFrame metody v rozhraní IDataModelScriptDebugStack představující segment zásobníku, kde došlo k přerušení. Rozhraní IDataModelScriptDebugStackFrame, které je vráceno k reprezentaci tohoto rámce, je definováno následujícím způsobem.
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;
}
Metoda GetName vrátí zobrazovaný název (např. název funkce) tohoto rámce. Tento název se zobrazí v backtrace zásobníku prezentovaného uživateli v rozhraní ladicího programu.
Metoda GetPosition vrátí pozici ve skriptu reprezentovaný rámcem zásobníku. Tuto metodu lze volat pouze v případě, že skript je uvnitř přerušení reprezentované zásobníkem, ve kterém je tento rámec obsažen. Pozice řádku a sloupce v rámci tohoto rámce se vždy vrátí. Pokud ladicí program dokáže vrátit rozsah pozice spuštění v rámci skriptu, může být v argumentu positionSpanEnd vrácena koncová pozice. Pokud ladicí program není schopen, hodnoty řádků a sloupců na konci rozsahu (pokud jsou požadovány) by měly být nastaveny na nulu.
Rozhraní IDataModelScriptDebugStack představuje segment zásobníku volání – část zásobníku volání, která je obsažena v kontextu jednoho skriptu. Pokud ladicí program dokáže rozpoznat přechod z jednoho skriptu do jiného (nebo jednoho zprostředkovatele skriptu do jiného), může to znamenat implementací IsTransitionPoint metody a vrácením true nebo false podle potřeby. Rámec zásobníku volání, který zadal skript, ve kterém se segment vztahuje, by se měl považovat za přechodový bod. Všechny ostatní snímky nejsou.
Pokud je daný rámec zásobníku přechodový bod určený metodou IsTransition (viz dokumentace k definici přechodových bodů), metoda GetTransition vrátí informace o přechodu. Konkrétně tato metoda vrátí předchozí skript – ten, který provedl volání do skriptu reprezentované segmentem zásobníku obsahujícího tento IDataModelScriptDebugStackFrame.
Metoda Evaluate vyhodnocuje výraz (jazyka zprostředkovatele skriptu) v kontextu rámce zásobníku reprezentovaného rozhraním IDataModelScriptDebugStackFrame, na kterém byla tato metoda volána. Výsledek vyhodnocení výrazu musí být zařazován ze zprostředkovatele skriptu jako IModelObject. Vlastnosti a další konstrukty ve výsledném objektu IModelObject musí být všechny možné získat, zatímco ladicí program je ve stavu přerušení.
EnumerateLocals metoda vrací proměnnou sadu (reprezentované IDataModelScriptDebugVariableSetEnumerator rozhraní) pro všechny místní proměnné, které jsou v oboru v kontextu rámce zásobníku reprezentované IDataModelScriptDebugStackFrame rozhraní, na kterém byla tato metoda volána.
EnumerateArguments metoda vrací proměnnou sadu (reprezentované IDataModelScriptDebugVariableSetEnumerator rozhraní) pro všechny argumenty funkce volané v rámci zásobníku reprezentované IDataModelScriptDebugStackFrame rozhraní, na kterém byla tato metoda volána.
zobrazení proměnných: IDataModelScriptDebugVariableSetEnumerator
Sada proměnných v ladicím skriptu (ať už jsou v určitém oboru, místní hodnoty funkce, argumenty funkce atd.) reprezentována proměnnou definovanou prostřednictvím rozhraní IDataModelScriptDebugVariableSetEnumerator:
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;
}
Metoda Reset resetuje pozici enumerátoru na místo, kde byl bezprostředně po vytvoření - to znamená před prvním prvkem sady.
GetNext metoda přesune enumerátor na další proměnnou v sadě a vrátí název, hodnotu a všechna metadata přidružená k proměnné. Pokud enumerátor dosáhne konce sady, vrátí se chyba E_BOUNDS. Jakmile se značka E_BOUNDS vrátí z Metody GetNext, bude pokračovat v vytváření E_BOUNDS při opětovném volání, pokud není provedeno volání resetování.
zarážky: IDataModelScriptDebugBreakpoint
Zarážky skriptu se nastavují prostřednictvím metody SetBreakpoint v ladicím rozhraní daného skriptu. Tyto zarážky jsou reprezentovány jedinečným ID i implementací IDataModelScriptDebugBreakpoint rozhraní, které je definováno následujícím způsobem.
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;
}
Metoda GetId vrátí jedinečný identifikátor přiřazený ladicí modul zprostředkovatele skriptu k zarážce. Tento identifikátor musí být jedinečný v kontextu obsahujícího skriptu. Identifikátor zarážky může být jedinečný pro poskytovatele; to však není nutné.
IsEnabled metoda vrátí, zda je zarážka povolena. Zakázaná zarážka stále existuje a je stále v seznamu zarážek pro skript, je pouze dočasně vypnutá. Všechny zarážky by se měly vytvořit v povoleném stavu.
Metoda Enable povolí zarážku. Pokud byla zarážka zakázaná, "dosažení zarážky" po volání této metody způsobí přerušení ladicího programu.
Metoda Disable zakáže zarážku. Po tomto volání se "dosažení zarážky" po volání této metody nebude rozdělit do ladicího programu. Zarážka, i když je stále přítomná, se považuje za vypnutou.
Metoda Remove odebere zarážku z jejího seznamu obsahujícího. Zarážka již po vrácení této metody neexistuje sémanticky. Rozhraní IDataModelScriptDebugBreakpoint, které reprezentovalo zarážku, se považuje za osamocené po volání. Nic jiného s ním (právně) nemůže být provedeno po tomto volání, než jeho uvolnění.
Metoda GetPosition vrátí pozici zarážky v rámci skriptu. Ladicí program skriptu musí vrátit řádek a sloupec ve zdrojovém kódu, kde se nachází zarážka. Pokud to dokáže, může také vrátit rozsah zdroje reprezentovaný zarážkou vyplněním koncové pozice definované argumentem positionSpanEnd. Pokud ladicí program nemůže vytvořit toto rozpětí a volající ho požádá, musí být pole Řádek a Sloupec koncové pozice rozsahu vyplněna jako nula, což znamená, že hodnoty nelze zadat.
výčet zarážek: IDataModelScriptDebugBreakpointEnumerator
Pokud poskytovatel skriptů podporuje ladění, musí také sledovat všechny zarážky přidružené ke každému a každému skriptu a být schopen vytvořit výčet těchto zarážek do ladicího rozhraní. Enumerátor pro zarážky je získán prostřednictvím EnumerateBreakpoints metoda pro ladicí rozhraní pro daný skript a je definována následujícím způsobem.
DECLARE_INTERFACE_(IDataModelScriptDebugBreakpointEnumerator, IUnknown)
{
STDMETHOD(Reset)() PURE;
STDMETHOD(GetNext)(_COM_Outptr_ IDataModelScriptDebugBreakpoint **breakpoint) PURE;
}
Metoda Reset resetuje pozici enumerátoru na místo, kde byl právě po vytvoření enumerátoru – to znamená před prvním výčtem zarážky.
Metoda GetNext přesune enumerátor vpřed na další zarážku, která má být uvedena a vrátí IDataModelScriptDebugBreakpoint rozhraní pro danou zarážku. Pokud enumerátor dosáhl konce výčtu, vrátí E_BOUNDS. Jakmile dojde k chybě E_BOUNDS, následná volání metody GetNext budou pokračovat v vytváření E_BOUNDS, pokud nebyla provedena intervenující volání metody Reset.
Viz také
Toto téma je součástí řady, která popisuje rozhraní přístupná z jazyka C++, jak je použít k sestavení rozšíření ladicího programu založeného na jazyce C++ a jak využít jiné konstruktory datového modelu (např. JavaScript nebo NatVis) z rozšíření datového modelu jazyka C++.
Přehled datového modelu Ladicího programu C++
rozhraní datového modelu C++ ladicího programu
objekty C++ datového modelu ladicího programu