Felsökning av datamodell C++-skript

Det här avsnittet beskriver hur du använder felsökningsdatamodellen C++ Felsökning av C++-skript för datamodell C++ för att stödja automatisering med felsökningsmotorn med skript.

Skripthantering i felsökningsdatamodellen

Förutom datamodellhanterarens roll som central utfärdare för skapande och utökning av objekt ansvarar den även för hanteringen av ett abstrakt begrepp med skript. Från skripthanterarens del av Data Model Manager är ett skript något som kan läsas in, tas bort dynamiskt och eventuellt debuggas av en provider för att utöka eller tillhandahålla nya funktioner till datamodellen.

En skriptprovider är en komponent som överbryggar ett språk (t.ex. NatVis, JavaScript osv.) till datamodellen. Det registrerar ett eller flera filnamnstillägg (t.ex. ". ". NatVis", ".js") som hanteras av providern och som gör det möjligt för en felsökningsklient eller ett användargränssnitt att tillåta inläsning av skriptfiler med det specifika tillägget genom delegering till providern.

Core Script Manager: IDataModelScriptManager

Huvudgränssnittet för skripthanteraren definieras på följande sätt.

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

Metoden GetDefaultNameBinder returnerar datamodellens standardskriptnamnsbindning. En namnbindning är en komponent som löser ett namn inom kontexten för ett objekt. Med uttrycket "foo.bar" anropas till exempel en namnbindning för att matcha namnfältet i kontexten för objekt-foo. Pärmen som returneras här följer en uppsättning standardregler för datamodellen. Skriptprovidrar kan använda den här pärmen för att ge konsekvens i namnmatchning mellan leverantörer.

RegisterScriptProvider

Metoden RegisterScriptProvider informerar datamodellen om att det finns en ny skriptprovider som kan överbrygga ett nytt språk till datamodellen. När den här metoden anropas anropar skripthanteraren omedelbart den angivna skriptprovidern och frågar om egenskaperna för de skript som den hanterar. Om det redan finns en provider registrerad under namnet eller filnamnstillägget som den angivna skriptprovidern anger misslyckas den här metoden. Endast en enskild skriptprovider kan registreras som hanterare för ett visst namn eller filnamnstillägg.

UnregisterScriptProvider

Metoden UnregisterScriptProvider ångrar ett anrop till metoden RegisterScriptProvider. Namnet och filnamnstillägget som anges av den inpassade skriptprovidern associeras inte längre med det. Observera att det kan finnas ett stort antal utestående COM-referenser till skriptprovidern även efter avregistreringen. Den här metoden förhindrar endast inläsning/skapande av skript av den typ som den angivna skriptprovidern hanterar. Om ett skript som läses in av providern fortfarande läses in eller har manipulerat objektmodellen för felsökningsprogrammet (eller datamodellen) kan dessa manipulationer fortfarande ha referenser tillbaka till skriptet. Det kan finnas datamodeller, metoder eller objekt som direkt refererar till konstruktioner i skriptet. En skriptprovider måste vara beredd att hantera detta.

FindProviderForScriptType

Metoden FindProviderForScriptType söker i skripthanteraren efter en provider som har en skripttypsträng som anges i den här metoden. Om det inte går att hitta en metod misslyckas den här metoden. annars returneras en sådan skriptprovider till anroparen.

EnumerateScriptProviders

Metoden EnumerateScriptProviders returnerar en uppräknare som räknar upp varje skriptprovider som har registrerats med skripthanteraren via ett tidigare anrop till metoden RegisterScriptProvider.

Skriptprovideruppräkning: IDataModelScriptProviderEnumerator

Metoden EnumerateScriptProviders returnerar en uppräknare av följande formulär:

DECLARE_INTERFACE_(IDataModelScriptProviderEnumerator, IUnknown)
{
    STDMETHOD(Reset)() PURE;
    STDMETHOD(GetNext)(_COM_Outptr_ IDataModelScriptProvider **provider) PURE;
}

Återställ

Metoden Återställ flyttar uppräknaren till den position den befann sig på innan det första elementet returnerades.

GetNext

Metoden GetNext flyttar uppräknaren framåt ett element och returnerar skriptprovidern som finns i det elementet. När uppräknaren når slutet av uppräkningen returneras E_BOUNDS. Om du anropar metoden GetNext när du har fått det här felet fortsätter E_BOUNDS på obestämd tid.

Felsökningsdatamodell C++ Värdgränssnitt för skript

värdens roll i skript

Felsökningsvärden exponerar en serie gränssnitt på mycket låg nivå för att förstå typen av system för dess felsökningsmål, utvärdera uttryck på språket för dess felsökningsmål osv. Normalt sett är det obekymrad med konstruktioner på högre nivå, till exempel skript. Detta lämnas till det övergripande felsökningsprogrammet eller tillägg som tillhandahåller dessa funktioner. Det finns dock ett undantag till detta. Alla felsökningsvärdar som vill delta i den övergripande skriptupplevelsen som tillhandahålls av datamodellen måste implementera några enkla gränssnitt för att tillhandahålla kontexter till skript. I själva verket har felsökningsvärden kontroll över var den vill att skriptmiljön ska placera funktioner och andra skript som tillhandahålls i datamodellens namnområde. Genom att delta i den här processen kan värden tillåta (eller inte) använda sådana funktioner i till exempel dess uttrycksutvärdering. De gränssnitt som ingår från värdens perspektiv här är:

Gränssnitt Beskrivning
IDebugHostScriptHost Gränssnittet som anger funktionen för felsökningsvärden att delta i skriptmiljön. Det här gränssnittet gör det möjligt att skapa kontexter som informerar skriptmotorer om var objekt ska placeras.
IDataModelScriptHostContext Ett värdgränssnitt som används av skriptprovidern som en container för innehållet i skriptet. Hur innehållet i en annan skriptyta än de manipuleringar som utförs med objektmodellen i felsökningsprogrammet är upp till den specifika felsökningsvärden. Med det här gränssnittet kan skriptprovidern hämta information om var innehållet ska placeras. Mer information finns i C++-skriptgränssnitt för datamodell senare i det här avsnittet.

Felsökningsvärdens skriptvärd: IDebugHostScriptHost

Gränssnittet IDebugHostScriptHost är det gränssnitt som används av en skriptprovider för att hämta en kontext från felsökningsvärden för ett nyligen skapat skript. Den här kontexten innehåller ett objekt (som tillhandahålls av felsökningsvärden) där skriptprovidern kan placera alla bryggor mellan datamodellen och skriptmiljön. Sådana bryggor kan till exempel vara datamodellmetoder som anropar skriptfunktioner. På så sätt kan en anropare på datamodellsidan anropa skriptmetoder genom att använda anropsmetoden i IModelMethod-gränssnittet.

Gränssnittet IDebugHostScriptHost definieras på följande sätt.

DECLARE_INTERFACE_(IDebugHostScriptHost, IUnknown)
{
    STDMETHOD(CreateContext)(_In_ IDataModelScript* script, _COM_Outptr_ IDataModelScriptHostContext** scriptContext) PURE;
}

CreateContext

Metoden CreateContext anropas av en skriptprovider för att skapa en ny kontext där innehållet i skriptet ska lagras. En sådan kontext representeras av gränssnittet IDataModelScriptHostContext som beskrivs i detalj på sidan C++-skriptgränssnitt för datamodell.

Felsökningsgränssnitt för datamodell C++

skript- och skriptgränssnitt

Den övergripande arkitekturen för datamodellen gör att en tredje part kan definiera en brygga mellan något språk och datamodellens objektmodell. Det språk som bryggs är vanligtvis ett skriptspråk eftersom datamodellens miljö är mycket dynamisk. En komponent som definierar och implementerar den här bryggan mellan ett språk och objektmodellen för datamodellen kallas för en skriptprovider. När den initieras registreras en skriptprovider med skripthanterarens del av datamodellhanteraren och alla gränssnitt som hanterar utökningsbarhet möjliggör därefter redigering, inläsning, avlastning och potentiell felsökning av skript som skrivits till det språk som skriptprovidern hanterar.

Observera att felsökningsverktyg för Windows för närvarande definierar två skriptproviders.

  • NatVis-providern. Den här providern är inbäddad i DbgEng.dll och brygger mellan NatVis XML och datamodeller, vilket möjliggör visualisering av inbyggda/språkbaserade datatyper.
  • JavaScript-providern. Den här providern finns i ett äldre felsökningstillägg: JsProvider.dll. Den överbryggar mellan skript som skrivits i JavaScript-språket och datamodellen, vilket möjliggör godtyckliga former av felsökningskontroll och utökningsbarhet.

Nya leverantörer kan skrivas som överbryggar andra språk (t.ex. Python osv.) till datamodellen. Detta skulle för närvarande kapslas in i äldre felsökningstillägg i inläsningssyfte. Själva skriptprovidern bör minimera beroendet med äldre motorgränssnitt och bör endast använda API:erna för datamodeller där det är möjligt. Detta gör det möjligt för providern att göras portabel till andra miljöer med betydligt större lätthet.

Det finns två klasser av gränssnitt som är relaterade till skriptprovidrar. Den första klassen av gränssnitt är för allmän hantering av skriptproviders och de skript som de hanterar. Den andra klassen av gränssnitt är till för stöd för skriptfelsökning. Stöd för den första uppsättningen är obligatoriskt, men stöd för den andra är valfritt och kanske inte är meningsfullt för alla leverantörer.

De allmänna hanteringsgränssnitten är:

Gränssnitt Beskrivning
IDataModelScriptProvider Det kärngränssnitt som en skriptprovider måste implementera. Det här är gränssnittet som är registrerat med skripthanterarens del av datamodellhanteraren för att annonsera leverantörens stöd för en viss typ av skript och registrera mot ett visst filnamnstillägg
IDataModelScript En abstraktion av ett visst skript som hanteras av providern. Varje skript som läses in eller redigeras har en separat IDataModelScript-instans
IDataModelScriptClient Ett klientgränssnitt som används av skriptprovidern för att kommunicera information till ett användargränssnitt. Skriptprovidrar implementerar inte det här gränssnittet. Programmet som är värd för datamodellen som vill använda skriptprovidrar gör det. En skriptprovider anropar metoder för skriptklienten för att rapportera status, fel osv.
IDataModelScriptHostContext Ett värdgränssnitt som används av skriptprovidern som en container för innehållet i skriptet. Hur innehållet i en annan skriptyta än de manipuleringar som utförs med objektmodellen i felsökningsprogrammet är upp till den specifika felsökningsvärden. Med det här gränssnittet kan skriptprovidern hämta information om var innehållet ska placeras.
IDataModelScriptTemplate Skriptprovidrar kan tillhandahålla en eller flera mallar som fungerar som utgångspunkter för användare att skapa skript. Ett felsökningsprogram som tillhandahåller en inbyggd redigerare kan fylla i nya skript med mallinnehåll som annonseras av providern via det här gränssnittet.
IDataModelScriptTemplateEnumerator Ett uppräkningsgränssnitt som skriptprovidern implementerar för att annonsera alla de olika mallar som den stöder.
IDataModelNameBinder En namnbindning – ett objekt som kan associera ett namn i en kontext med ett värde. För ett givet uttryck, till exempel "foo.bar", kan ett namnbindning binda namnet "bar" i kontexten för objektet "foo" och skapa ett värde eller en referens till det. Namnbindare implementeras vanligtvis inte av en skriptprovider. i stället kan standardbindningen hämtas från datamodellen och användas av skriptprovidern

Felsökningsgränssnitten är:

Gränssnitt Beskrivning
IDataModelScriptDebug Det kärngränssnitt som en skriptprovider måste ange för att ett skript ska kunna kopplas från. Implementeringsklassen för IDataModelScript-gränssnittet måste QueryInterface för IDataModelScriptDebug om skriptet är felsökningsbart.
IDataModelScriptDebugClient Användargränssnittet som vill tillhandahålla funktionen för skriptfelsökning implementerar gränssnittet IDataModelScriptDebugClient. Skriptprovidern använder det här gränssnittet för att skicka felsökningsinformation fram och tillbaka (t.ex. händelser som inträffar, brytpunkter osv.)
IDataModelScriptDebugStack Skriptprovidern implementerar det här gränssnittet för att exponera begreppet anropsstack för skriptfelsökaren.
IDataModelScriptDebugStackFrame Skriptprovidern implementerar det här gränssnittet för att exponera begreppet en viss stackram i anropsstacken.
IDataModelScriptDebugVariableSetEnumerator Skriptprovidern implementerar det här gränssnittet för att exponera en uppsättning variabler. Den här uppsättningen kan representera uppsättningen parametrar för en funktion, uppsättningen lokala variabler eller uppsättningen variabler inom ett visst omfång. Den exakta innebörden beror på hur gränssnittet förvärvades.
IDataModelScriptDebugBreakpoint Skriptprovidern implementerar det här gränssnittet för att exponera begreppet och kontrollen över en viss brytpunkt i skriptet.
IDataModelScriptDebugBreakpointEnumerator Skriptprovidern implementerar detta för att räkna upp alla brytpunkter som för närvarande finns i skriptet (oavsett om de är aktiverade eller inte).

Core Script Provider: IDataModelScriptProvider

Alla tillägg som vill vara en skriptprovider måste tillhandahålla en implementering av gränssnittet IDataModelScriptProvider och registrera det med skripthanterarens del av datamodellhanteraren via metoden RegisterScriptProvider. Det här kärngränssnittet som måste implementeras definieras på följande sätt.

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

Metoden GetName returnerar namnet på den typ av (eller språk för) skript som providern hanterar som en sträng som allokeras via metoden SysAllocString. Anroparen ansvarar för att frigöra den returnerade strängen via SysFreeString. Exempel på strängar som kan returneras från den här metoden är "JavaScript" eller "NatVis". Den returnerade strängen visas troligen i användargränssnittet för felsökningsprogrammet som är värd för datamodellen. Inga två skriptprovidrar får returnera samma namn (skiftlägesokänsligt).

GetExtension

Metoden GetExtension returnerar filnamnstillägget för skript som hanteras av den här providern (utan punkten) som en sträng som allokeras via metoden SysAllocString. Felsökningsprogrammet som är värd för datamodellen (med stöd för skript) delegerar öppnandet av skriptfiler med det här tillägget till skriptprovidern. Anroparen ansvarar för att frigöra den returnerade strängen via SysFreeString. Exempel på strängar som kan returneras från den här metoden är "js" eller "NatVis".

CreateScript-

Metoden CreateScript anropas för att skapa ett nytt skript. Skriptprovidern måste returnera ett nytt och tomt skript som representeras av det returnerade IDataModelScript-gränssnittet när den här metoden anropas. Observera att den här metoden anropas oavsett om ett användargränssnitt skapar ett nytt tomt skript för redigering av användaren eller om felsökningsprogrammet läser in ett skript från disken. Providern engagerar sig inte i fil-I/O. Den hanterar bara begäranden från värdprogrammet via strömmar som skickas till metoder i IDataModelScript.

GetDefaultTemplateContent

Metoden GetDefaultTemplateContent returnerar ett gränssnitt för providerns standardmallinnehåll. Det här är innehåll som skriptprovidern vill fylla i i förväg i ett redigeringsfönster för ett nyligen skapat skript. Om skriptprovidern inte har några mallar (eller inte har något mallinnehåll som har angetts som standardinnehåll) kan skriptprovidern returnera E_NOTIMPL från den här metoden.

Räkna uppMallar

Metoden EnumerateTemplates returnerar en uppräknare som kan räkna upp de olika mallar som tillhandahålls av skriptprovidern. Mallinnehåll är vad skriptprovidern vill "fyllas i" i ett redigeringsfönster när ett nytt skript skapas. Om det finns flera olika mallar som stöds kan dessa mallar namnges (t.ex. "Imperativt skript", "tilläggsskript") och felsökningsprogrammet som är värd för datamodellen kan välja hur "mallarna" ska presenteras för användaren.

Huvudskriptgränssnittet: IDataModelScript

Huvudgränssnittet som hanterar ett enskilt skript som implementeras av providern är gränssnittet IDataModelScript. En komponent som implementerar det här gränssnittet returneras när klienten vill skapa ett nytt tomt skript och anropar Metoden CreateScript på IDataModelScriptProvider.

Varje skript som skapas av providern ska finnas i en oberoende silo. Ett skript ska inte kunna påverka ett annat skript, förutom genom explicit interaktion med externa objekt via datamodellen. Två skript kan till exempel både utöka någon typ eller ett begrepp (t.ex. felsökningsprogrammets uppfattning om vad en process är). Båda skripten kan sedan komma åt varandras fält via det externa processobjektet.

Gränssnittet definieras på följande sätt.

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

Metoden GetName returnerar namnet på skriptet som en allokerad sträng via funktionen SysAllocString. Om skriptet ännu inte har något namn ska metoden returnera en null-BSTR. Det bör inte misslyckas under den här situationen. Om skriptet uttryckligen byter namn via ett anrop till metoden Byt namn ska metoden GetName returnera det nyligen tilldelade namnet.

byt namn på

Metoden Byt namn tilldelar skriptet ett nytt namn. Det är skriptimplementeringens ansvar att spara det här namnet och returnera det vid valfritt anrop till Metoden GetName. Detta anropas ofta när ett användargränssnitt väljer att Spara som skriptet till ett nytt namn. Observera att om du byter namn på skriptet kan det påverka var värdprogrammet väljer att projicera innehållet i skriptet.

Fyll i

Metoden Populate anropas av klienten för att ändra eller synkronisera "innehållet" i skriptet. Det är meddelandet som görs till skriptprovidern att koden för skriptet har ändrats. Observera att den här metoden inte orsakar körning av skriptet eller ändringar i något av de objekt som skriptet manipulerar. Detta är bara ett meddelande till skriptprovidern om att innehållet i skriptet har ändrats så att det kan synkronisera sitt eget interna tillstånd.

kör

Metoden Execute kör innehållet i skriptet enligt det senaste lyckade Fyll-anropet och ändrar objektmodellen för felsökningsprogrammet enligt innehållet. Om språket (eller skriptprovidern) definierar en "huvudfunktion" – en som författaren vill anropa när han eller hon klickar på en imaginär "Kör skript"-knapp i ett användargränssnitt – anropas inte en sådan "huvudfunktion" under en körningsåtgärd. Åtgärden Execute kan anses utföra initierings- och objektmodellmanipuleringar (t.ex. att köra rotkod och konfigurera utökningspunkter).

Ta bort länk

Metoden Ta bort länk återställer åtgärden Kör. Alla objektmodellmanipuleringar eller utökningspunkter som upprättas under körningen av skriptet ångras. Efter en avlänkningsåtgärd kan skriptet köras igen via ett anrop till Kör eller så kan det släppas.

IsInvocable

Metoden IsInvocable returnerar om skriptet är anropbart eller inte, dvs. om det har en "huvudfunktion" som definierats av dess språk eller provider. En sådan "huvudfunktion" är konceptuellt något som skriptförfattaren skulle vilja anropa om en imaginär "Kör skript"-knapp trycktes in i ett användargränssnitt.

InvokeMain

Om skriptet har en "huvudfunktion" som är avsedd att köras från ett UI-anrop, anger det detta via en sann retur från metoden IsInvocable. Användargränssnittet kan sedan anropa metoden InvokeMain för att faktiskt "anropa" skriptet. Observera att detta skiljer sig från Kör som kör all rotkod och överbryggar skriptet till namnområdet för den underliggande värden.

**Skriptklienten: IDataModelScriptClient **

Ett program som är värd för den datamodell som vill hantera skript och har ett användargränssnitt (oavsett om det är grafiskt eller konsol) runt det här begreppet implementerar gränssnittet IDataModelScriptClient. Det här gränssnittet skickas till valfri skriptprovider under körning eller anrop eller ett skript för att skicka fel- och händelseinformation tillbaka till användargränssnittet.

Gränssnittet IDataModelScriptClient definieras på följande sätt.

DECLARE_INTERFACE_(IDataModelScriptClient, IUnknown)
{
   STDMETHOD(ReportError)(_In_ ErrorClass errClass, _In_ HRESULT hrFail, _In_opt_ PCWSTR message, _In_ ULONG line, _In_ ULONG position) PURE;
}

RapporteraFel

Om ett fel uppstår under körningen eller anropet av skriptet anropar skriptprovidern metoden ReportError för att meddela användargränssnittet om felet.

Värdkontexten för ett skript: IDataModelScriptHostContext

Felsökningsvärden har viss påverkan på hur och var den projicerar datamodellskriptinnehåll. Det förväntas att varje skript ber värden om en kontext där bryggor ska placeras i skriptet (t.ex. funktionsobjekt som kan anropas osv.). Den här kontexten hämtas via att anropa metoden CreateContext på IDebugHostScriptHost och hämta en IDataModelScriptHostContext.

Gränssnittet IDataModelScriptHostContext definieras på följande sätt.

DECLARE_INTERFACE_(IDataModelScriptHostContext, IUnknown)
{
   STDMETHOD(NotifyScriptChange)(_In_ IDataModelScript* script, _In_ ScriptChangeKind changeKind) PURE;
   STDMETHOD(GetNamespaceObject)(_COM_Outptr_ IModelObject** namespaceObject) PURE;
}

NotifyScriptChange

Det krävs att en skriptprovider meddelar felsökningsvärden vid vissa åtgärder som inträffar med ett metodanrop till metoden NotifyScriptChange i den associerade kontexten. Sådana åtgärder definieras som medlemmar i ScriptChangeKind-uppräkningen

GetNamespaceObject

Metoden GetNamespaceObject returnerar ett objekt där skriptprovidern kan placera eventuella bryggor mellan datamodellen och skriptet. Det är till exempel här som skriptprovidern kan placera datamodellmetodobjekt (IModelMethod-gränssnitt i IModelObject) vars implementering anropar motsvarande namngivna funktioner i skriptet.

mallar för nyligen skapade skript: IDataModelScriptTemplate

Skriptprovidrar som vill presentera förfyllt innehåll för nya skript (t.ex. för att hjälpa användare att skriva skript i ett felsökningsanvändargränssnitt) kan göra det genom att tillhandahålla en eller flera skriptmallar. Sådana mallar är komponenter som implementerar gränssnittet IDataModelScriptTemplate och returneras via metoden GetDefaultTemplate eller metoden EnumerateTemplates på skriptprovidern.

Gränssnittet IDataModelScriptTemplate definieras på följande sätt.

DECLARE_INTERFACE_(IDataModelScriptTemplate, IUnknown)
{
   STDMETHOD(GetName)(_Out_ BSTR *templateName) PURE;
   STDMETHOD(GetDescription)(_Out_ BSTR *templateDescription) PURE;
   STDMETHOD(GetContent)(_COM_Outptr_ IStream **contentStream) PURE;
}

GetName

Metoden GetName returnerar ett namn på mallen. Detta kan misslyckas med E_NOTIMPL om mallen inte har något namn. Den enda standardmallen (om sådan finns) krävs inte för att ha ett namn. Alla andra mallar är det. Dessa namn kan visas i ett användargränssnitt som en del av en meny för att välja vilken mall som ska skapas.

GetDescription

Metoden GetDescription returnerar en beskrivning av mallen. En sådan beskrivning skulle presenteras för användaren i mer beskrivande gränssnitt för att hjälpa användaren att förstå vad mallen är utformad för att göra. Mallen kan returnera E_NOTIMPL från den här metoden om den inte har någon beskrivning.

GetContent

Metoden GetContent returnerar mallens innehåll (eller kod). Det här är vad som skulle fyllas i i redigeringsfönstret i förväg om en användare valde att skapa ett nytt skript från den här mallen. Mallen ansvarar för att skapa (och returnera) en standardström över innehållet som klienten kan hämta.

uppräkning av en providers mallinnehåll: IDataModelScriptTemplateEnumerator

En skriptprovider kan tillhandahålla en eller flera mallar som fyller innehållet i nya skript i något användargränssnitt. Om någon av dessa mallar tillhandahålls måste skriptprovidern implementera en uppräknare över dem som returneras vid ett anrop till metoden EnumerateTemplates.

En sådan uppräknare är en implementering av gränssnittet IDataModelScriptTemplateEnumerator och definieras på följande sätt.

DECLARE_INTERFACE_(IDataModelScriptTemplateEnumerator, IUnknown)
{
   STDMETHOD(Reset)() PURE;
   STDMETHOD(GetNext)(_COM_Outptr_ IDataModelScriptTemplate **templateContent) PURE;
}

Återställ

Metoden Återställ återställer uppräknaren till den position den befann sig på när den först skapades – innan den första mallen skapades.

GetNext

Metoden GetNext flyttar uppräknaren till nästa mall och returnerar den. I slutet av uppräkningen returnerar uppräknaren E_BOUNDS. När E_BOUNDS markören har träffats fortsätter uppräknaren att producera E_BOUNDS fel på obestämd tid tills ett återställningsanrop görs.

lösa namns betydelse: IDataModelNameBinder

Datamodellen är ett standardsätt för skriptproviders att fastställa innebörden av ett givet namn i en viss kontext (t.ex. att bestämma vilket fält som betyder för foo.bar) som ska fungera över en mängd olika skriptproviders. Den här mekanismen kallas namnbindning och representeras av gränssnittet IDataModelNameBinder. En sådan pärm kapslar in en uppsättning regler om hur namnet löser sig och hur du hanterar konfliktlösning där ett namn definieras flera gånger för ett objekt. En del av dessa regler omfattar saker som hur ett projekterat namn (ett som läggs till av en datamodell) matchar mot ett inbyggt namn (ett i typsystemet för det språk som debuggas).

För att ge en viss konsekvens mellan skriptprovidrar tillhandahåller datamodellens skripthanterare en standardnamnbindning. Den här standardnamnbindningen kan hämtas via ett anrop till metoden GetDefaultNameBinder i gränssnittet IDataModelScriptManager. Namnbindningsgränssnittet definieras på följande sätt.

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

Metoden BindValue utför motsvarigheten till contextObject.name på det angivna objektet enligt en uppsättning bindningsregler. Resultatet av den här bindningen är ett värde. Som ett värde kan den underliggande skriptprovidern inte använda värdet för att utföra tilldelningen tillbaka till namnet.

BindReference

BindReference-metoden liknar BindValue eftersom den även utför motsvarigheten till contextObject.name på det angivna objektet enligt en uppsättning bindningsregler. Resultatet av bindningen från den här metoden är dock en referens i stället för ett värde. Som referens kan skriptprovidern använda referensen för att utföra tilldelningen tillbaka till namnet.

EnumerateValues

Metoden EnumerateValues räknar upp den uppsättning namn och värden som ska bindas mot objektet enligt reglerna för Metoden BindValue. Till skillnad från enumerateKeys, EnumerateValues och liknande metoder på IModelObject som kan returnera flera namn med samma värde (för basklasser, överordnade modeller och liknande) returnerar den här uppräknaren endast den specifika uppsättningen namn som binder till BindValue och BindReference. Namn dupliceras aldrig. Observera att det finns en betydligt högre kostnad för att räkna upp ett objekt via namnbindningen än att anropa IModelObject-metoderna.

EnumerateReferences

Metoden EnumerateReferences räknar upp uppsättningen namn och referenser till dem som binder mot objektet enligt reglerna för metoden BindReference. Till skillnad från enumerateKeys, EnumerateValues och liknande metoder på IModelObject som kan returnera flera namn med samma värde (för basklasser, överordnade modeller och liknande) returnerar den här uppräknaren endast den specifika uppsättningen namn som binder till BindValue och BindReference. Namn dupliceras aldrig. Observera att det finns en betydligt högre kostnad för att räkna upp ett objekt via namnbindningen än att anropa IModelObject-metoderna.

Felsökar datamodell C++ Skriptfelsökningsgränssnitt

Infrastrukturen för skriptprovidrar i datamodellen ger också ett koncept kring felsökning av skript. Alla skript som vill exponera felsökningsfunktioner för felsökningsvärden och felsökningsprogrammet som är värd för datamodellen kan göra det genom att använda felsökningsbara skript för att implementera gränssnittet IDataModelScriptDebug utöver IDataModelScript-gränssnittet. Förekomsten av det här gränssnittet i skriptet anger för infrastrukturen att det kan kopplas bort.

Även om IDataModelScriptDebug-gränssnittet är utgångspunkten för att få åtkomst till felsökningsfunktionerna hos en skriptprovider, kopplas det av en uppsättning andra gränssnitt för att tillhandahålla övergripande felsökningsfunktioner.

Felsökningsgränssnitten är:

Gränssnitt Beskrivning
IDataModelScriptDebug Det kärngränssnitt som en skriptprovider måste ange för att ett skript ska kunna kopplas från. Implementeringsklassen för IDataModelScript-gränssnittet måste QueryInterface för IDataModelScriptDebug om skriptet är felsökningsbart.
IDataModelScriptDebugClient Användargränssnittet som vill tillhandahålla funktionen för skriptfelsökning implementerar gränssnittet IDataModelScriptDebugClient. Skriptprovidern använder det här gränssnittet för att skicka felsökningsinformation fram och tillbaka (t.ex. händelser som inträffar, brytpunkter osv.)
IDataModelScriptDebugStack Skriptprovidern implementerar det här gränssnittet för att exponera begreppet anropsstack för skriptfelsökaren.
IDataModelScriptDebugStackFrame Skriptprovidern implementerar det här gränssnittet för att exponera begreppet en viss stackram i anropsstacken.
IDataModelScriptDebugVariableSetEnumerator Skriptprovidern implementerar det här gränssnittet för att exponera en uppsättning variabler. Den här uppsättningen kan representera uppsättningen parametrar för en funktion, uppsättningen lokala variabler eller uppsättningen variabler inom ett visst omfång. Den exakta innebörden beror på hur gränssnittet förvärvades.
IDataModelScriptDebugBreakpoint Skriptprovidern implementerar det här gränssnittet för att exponera begreppet och kontrollen över en viss brytpunkt i skriptet.
IDataModelScriptDebugBreakpointEnumerator Skriptprovidern implementerar detta för att räkna upp alla brytpunkter som för närvarande finns i skriptet (oavsett om de är aktiverade eller inte).

De allmänna hanteringsgränssnitten är:

Gränssnitt Beskrivning
IDataModelScriptProvider Det kärngränssnitt som en skriptprovider måste implementera. Det här är gränssnittet som är registrerat med skripthanterarens del av datamodellhanteraren för att annonsera leverantörens stöd för en viss typ av skript och registrera mot ett visst filnamnstillägg
IDataModelScript En abstraktion av ett visst skript som hanteras av providern. Varje skript som läses in eller redigeras har en separat IDataModelScript-instans
IDataModelScriptClient Ett klientgränssnitt som används av skriptprovidern för att kommunicera information till ett användargränssnitt. Skriptprovidrar implementerar inte det här gränssnittet. Programmet som är värd för datamodellen som vill använda skriptprovidrar gör det. En skriptprovider anropar metoder för skriptklienten för att rapportera status, fel osv.
IDataModelScriptHostContext Ett värdgränssnitt som används av skriptprovidern som en container för innehållet i skriptet. Hur innehållet i en annan skriptyta än de manipuleringar som utförs med objektmodellen i felsökningsprogrammet är upp till den specifika felsökningsvärden. Med det här gränssnittet kan skriptprovidern hämta information om var innehållet ska placeras.
IDataModelScriptTemplate Skriptprovidrar kan tillhandahålla en eller flera mallar som fungerar som utgångspunkter för användare att skapa skript. Ett felsökningsprogram som tillhandahåller en inbyggd redigerare kan fylla i nya skript med mallinnehåll som annonseras av providern via det här gränssnittet.
IDataModelScriptTemplateEnumerator Ett uppräkningsgränssnitt som skriptprovidern implementerar för att annonsera alla de olika mallar som den stöder.
IDataModelNameBinder En namnbindning – ett objekt som kan associera ett namn i en kontext med ett värde. För ett givet uttryck, till exempel "foo.bar", kan ett namnbindning binda namnet "bar" i kontexten för objektet "foo" och skapa ett värde eller en referens till det. Namnbindare implementeras vanligtvis inte av en skriptprovider. I stället kan standardbindningen hämtas från datamodellen och användas av skriptprovidern.

Att göra skript felsökningsbara: IDataModelScriptDebug

Alla skript som är felsökningsbara anger den här funktionen via förekomsten av IDataModelScriptDebug-gränssnittet på samma komponent som implementerar IDataModelScript. Frågan för det här gränssnittet av felsökningsvärden eller felsökningsprogrammet som är värd för datamodellen är det som anger förekomsten av felsökningsfunktionen.

Gränssnittet IDataModelScriptDebug definieras på följande sätt.

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

Metoden GetDebugState returnerar det aktuella tillståndet för skriptet (t.ex. om det körs eller inte). Tillståndet definieras av ett värde i ScriptDebugState-uppräkningen.

GetCurrentPosition

Metoden GetCurrentPosition returnerar den aktuella positionen i skriptet. Detta kan bara anropas när skriptet är indelat i felsökningsprogrammet där ett anrop till GetScriptState skulle returnera ScriptDebugBreak. Alla andra anrop till den här metoden är ogiltiga och misslyckas.

GetStack

Metoden GetStack hämtar den aktuella anropsstacken vid brytpositionen. Den här metoden kan bara anropas när skriptet är indelat i felsökningsprogrammet.

SetBreakpoint

Metoden SetBreakpoint anger en brytpunkt i skriptet. Observera att implementeringen är fri att justera de inpassade rad- och kolumnpositionerna för att gå vidare till en lämplig kodposition. De faktiska rad- och kolumnnumren där brytpunkten placerades kan hämtas med metodanrop i det returnerade gränssnittet IDataModelScriptDebugBreakpoint.

FindBreakpointById

Varje brytpunkt som skapas i skriptet via Metoden SetBreakpoint tilldelas en unik identifierare (ett 64-bitars osignerat heltal) av implementeringen. Metoden FindBreakpointById används för att hämta ett gränssnitt till brytpunkten från en viss identifierare.

EnumerateBreakpoints

Metoden EnumerateBreakpoints returnerar en uppräknare som kan räkna upp varje brytpunkt som anges i ett visst skript.

GetEventFilter

Metoden GetEventFilter returnerar om "break on event" är aktiverat för en viss händelse. Händelser som kan orsaka "break on event" beskrivs av en medlem i ScriptDebugEventFilter-uppräkningen.

SetEventFilter

Metoden SetEventFilter ändrar beteendet "break on event" för en viss händelse enligt definitionen av en medlem i ScriptDebugEventFilter-uppräkningen. En fullständig lista över tillgängliga händelser (och en beskrivning av den här uppräkningen) finns i dokumentationen för metoden GetEventFilter.

StartDebugging

StartDebugging-metoden "aktiverar" felsökningsprogrammet för ett visst skript. Åtgärden att starta felsökning orsakar inte aktivt någon körningspaus eller stegning. Det gör bara skriptet felsökningsbart och tillhandahåller en uppsättning gränssnitt som klienten kan kommunicera med felsökningsgränssnittet.

StopDebugging

Metoden StopDebugging anropas av en klient som vill sluta felsöka. Det här metodanropet kan göras när som helst efter att StartDebugging har gjorts (t.ex. under en paus, medan skriptet körs osv.). Anropet upphör omedelbart med all felsökningsaktivitet och återställer tillståndet tillbaka till innan StartDebugging anropades.

felsökningsgränssnittet: IDataModelScriptDebugClient

Felsökningsvärden eller felsökningsprogrammet som vill tillhandahålla ett gränssnitt kring skriptfelsökning måste tillhandahålla en implementering av IDataModelScriptDebugClient-gränssnittet till skriptfelsökaren via StartDebugging-metoden i felsökningsgränssnittet för skriptet.

IDataModelScriptDebugClient är kommunikationskanalen där felsökningshändelser skickas och kontrollen går från skriptkörningsmotorn till ett felsökningsgränssnitt. Det definieras på följande sätt.

DECLARE_INTERFACE_(IDataModelScriptDebugClient, IUnknown)
{
   STDMETHOD(NotifyDebugEvent)(_In_ ScriptDebugEventInformation *pEventInfo, _In_ IDataModelScript *pScript, _In_opt_ IModelObject *pEventDataObject, _Inout_ ScriptExecutionKind *resumeEventKind) PURE;
}

NotifyDebugEvent

När en händelse inträffar som bryter sig in i skriptfelsökaren gör själva felsökningskoden ett anrop till gränssnittet via metoden NotifyDebugEvent. Den här metoden är synkron. Ingen körning av skriptet återupptas förrän gränssnittet returnerar från händelsen. Definitionen av skriptfelsökaren är avsedd att vara enkel: det finns absolut inga kapslade händelser som kräver bearbetning. En felsökningshändelse definieras av en variantpost som kallas ScriptDebugEventInformation. Vilka fält i händelseinformationen som är giltiga definieras till stor del av debugEvent-medlemmen. Den definierar vilken typ av händelse som inträffade enligt beskrivningen av en medlem i ScriptDebugEvent-uppräkningen.

Anropsstacken: IDataModelScriptDebugStack

När en händelse inträffar som bryter sig in i skriptfelsökaren vill felsökningsgränssnittet hämta anropsstacken för brytplatsen. Detta görs via metoden GetStack. En sådan stack uttrycks via IDataModelScriptDebugStack som definieras enligt nedan.

Observera att den övergripande stacken kan sträcka sig över flera skript och/eller flera skriptproviders. Anropsstacken som returneras från ett enda anrop till metoden GetStack i ett visst skripts felsökningsgränssnitt bör endast returnera segmentet för anropsstacken inom gränserna för skriptet. Det är fullt möjligt att en skriptfelsökmotor kan hämta anropsstacken som sträcker sig över flera skriptkontexter om två skript från samma provider interagerar. Metoden GetStack bör inte returnera den del av stacken som finns i ett annat skript. Om den här situationen i stället kan identifieras bör stackramen som är gränsramen i skriptet markera sig själv som en övergångsram via en implementering av metoderna IsTransitionPoint och GetTransition på stackramen. Det förväntas att felsökningsgränssnittet sammanfogar den övergripande stacken från de flera stacksegment som finns.

Det är absolut nödvändigt att övergångar implementeras på det här sättet eller att felsökningsgränssnittet kan skicka frågor om lokala variabler, parametrar, brytpunkter och andra skriptspecifika konstruktioner till fel skriptkontext! Detta resulterar i odefinierat beteende i felsökningsgränssnittet.

DECLARE_INTERFACE_(IDataModelScriptDebugStack, IUnknown)
{
   STDMETHOD_(ULONG64, GetFrameCount)() PURE;
   STDMETHOD(GetStackFrame)(_In_ ULONG64 frameNumber, _COM_Outptr_ IDataModelScriptDebugStackFrame **stackFrame) PURE;
}

GetFrameCount

Metoden GetFrameCount returnerar antalet stackramar i det här segmentet av anropsstacken. Om providern kan identifiera ramar i olika skriptkontexter eller för olika leverantörer bör den ange detta för anroparen genom implementering av metoderna IsTransitionPoint och GetTransition i inmatningsramen i det här stacksegmentet.

GetStackFrame

GetStackFrame hämtar en viss stackram från stacksegmentet. Anropsstacken har ett nollbaserat indexeringssystem: den aktuella stackramen där brythändelsen inträffade är bildruta 0. Anroparen för den aktuella metoden är bildruta 1 (och så vidare).

Undersöka tillstånd när det är brutet: IDataModelScriptDebugStackFrame

En viss bildruta i anropsstacken när den är uppdelad i skriptfelsökaren kan hämtas via ett anrop till metoden GetStackFrame i gränssnittet IDataModelScriptDebugStack som representerar stacksegmentet där brytningen inträffade. Gränssnittet IDataModelScriptDebugStackFrame som returneras för att representera den här ramen definieras på följande sätt.

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

Metoden GetName returnerar visningsnamnet (t.ex. funktionsnamnet) för den här ramen. Ett sådant namn visas i stackens backtrace som visas för användaren i felsökningsgränssnittet.

GetPosition

Metoden GetPosition returnerar positionen i skriptet som representeras av stackramen. Den här metoden kan bara anropas när skriptet ligger inom en paus som representeras av stacken där den här ramen finns. Linje- och kolumnpositionen i den här ramen returneras alltid. Om felsökningsprogrammet kan returnera intervallet för "körningspositionen" i skriptet kan en slutposition returneras i argumentet positionSpanEnd. Om felsökaren inte kan göra detta ska rad- och kolumnvärdena i spannsslutet (om det begärs) anges till noll.

IsTransitionPoint

Gränssnittet IDataModelScriptDebugStack representerar ett segment av en anropsstack – den delen av anropsstacken som finns i kontexten för ett skript. Om felsökningsprogrammet kan identifiera övergången från ett skript till ett annat (eller en skriptprovider till en annan) kan det indikera detta genom att implementera Metoden IsTransitionPoint och returnera sant eller falskt efter behov. Anropsstackens ram som angav skriptet där segmentet gäller bör betraktas som en övergångspunkt. Alla andra bildrutor är inte det.

GetTransition

Om en viss stackram är en övergångspunkt som bestäms av metoden IsTransition (se dokumentationen där för en definition av övergångspunkter) returnerar metoden GetTransition information om övergången. I synnerhet returnerar den här metoden det tidigare skriptet – det som gjorde ett anrop till skriptet som representeras av stacksegmentet som innehåller den här IDataModelScriptDebugStackFrame.

Utvärdera

Metoden Evaluate utvärderar ett uttryck (av skriptproviderns språk) i kontexten för stackramen som representeras av gränssnittet IDataModelScriptDebugStackFrame som den här metoden anropades för. Resultatet av uttrycksutvärderingen måste konverteras från skriptprovidern som en IModelObject. Egenskaperna och andra konstruktioner på den resulterande IModelObject måste alla kunna hämtas medan felsökningsprogrammet är i ett avbrottstillstånd.

EnumerateLocals

Metoden EnumerateLocals returnerar en variabeluppsättning (representerad av ett IDataModelScriptDebugVariableSetEnumerator-gränssnitt) för alla lokala variabler som finns i omfånget i kontexten för stackramen som representeras av gränssnittet IDataModelScriptDebugStackFrame som den här metoden anropades för.

Räkna uppArguments

Metoden EnumerateArguments returnerar en variabeluppsättning (representerad av ett IDataModelScriptDebugVariableSetEnumerator-gränssnitt) för alla funktionsargument för funktionen som anropas i stackramen som representeras av gränssnittet IDataModelScriptDebugStackFrame som den här metoden anropades för.

Att titta på variabler: IDataModelScriptDebugVariableSetEnumerator

En uppsättning variabler i skriptet som debuggas (oavsett om de i ett visst omfång, en funktions lokala värden, argumenten för en funktion osv.) representeras av en variabeluppsättning som definierats via gränssnittet 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;
}

Återställ

Metoden Återställ återställer positionen för uppräknaren till den plats där den var omedelbart efter skapandet, dvs. före det första elementet i uppsättningen.

GetNext

Metoden GetNext flyttar uppräknaren till nästa variabel i uppsättningen och returnerar variabelns namn, värde och eventuella metadata som är associerade med den. Om uppräknaren har nått slutet av uppsättningen returneras felet E_BOUNDS. När E_BOUNDS-markören har returnerats från metoden GetNext fortsätter den att producera E_BOUNDS när den anropas igen om inte ett mellanliggande återställningsanrop görs.

Brytpunkter: IDataModelScriptDebugBreakpoint

Skriptbrytningspunkter anges via metoden SetBreakpoint i ett visst skripts felsökningsgränssnitt. Sådana brytpunkter representeras både av ett unikt ID och en implementering av gränssnittet IDataModelScriptDebugBreakpoint som definieras på följande sätt.

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

Metoden GetId returnerar den unika identifierare som tilldelats av skriptproviderns felsökningsmotor till brytpunkten. Den här identifieraren måste vara unik i kontexten för det innehållande skriptet. Brytpunktsidentifieraren kan vara unik för providern. Detta krävs dock inte.

IsEnabled

Metoden IsEnabled returnerar om brytpunkten är aktiverad eller inte. Det finns fortfarande en inaktiverad brytpunkt och finns fortfarande i listan över brytpunkter för skriptet. Den är bara "inaktiverad" tillfälligt. Alla brytpunkter ska skapas i aktiverat tillstånd.

Aktivera

Metoden Aktivera aktiverar brytpunkten. Om brytpunkten har inaktiverats kommer "att slå på brytpunkten" efter att den här metoden anropats att orsaka en inbrytning i felsökningsprogrammet.

Inaktivera

Metoden Inaktivera inaktiverar brytpunkten. Efter det här anropet kommer "slå brytpunkten" efter att ha anropat den här metoden inte att bryta sig in i felsökningsprogrammet. Brytpunkten, även om den fortfarande finns, anses vara "inaktiverad".

Ta bort

Metoden Ta bort tar bort brytpunkten från dess innehållande lista. Brytpunkten finns inte längre semantiskt när den här metoden har returnerats. Gränssnittet IDataModelScriptDebugBreakpoint som representerade brytpunkten anses vara överblivet efter anropet. Inget annat kan (lagligt) göras med det efter det här samtalet förutom att släppa det.

GetPosition

Metoden GetPosition returnerar positionen för brytpunkten i skriptet. Skriptfelsökaren måste returnera raden och kolumnen i källkoden där brytpunkten finns. Om den kan göra det kan den också returnera ett källintervall som representeras av brytpunkten genom att fylla i en slutposition som definieras av argumentet positionSpanEnd. Om felsökningsprogrammet inte kan producera det här intervallet och anroparen begär det, bör fälten Rad och Kolumn i intervallets slutposition fyllas i som noll som anger att värdena inte kan anges.

Breakpoint Enumeration: IDataModelScriptDebugBreakpointEnumerator

Om en skriptprovider stöder felsökning måste den också hålla reda på alla brytpunkter som är associerade med varje skript och kunna räkna upp dessa brytpunkter till felsökningsgränssnittet. Uppräknaren för brytpunkter hämtas via metoden EnumerateBreakpoints i felsökningsgränssnittet för ett visst skript och definieras på följande sätt.

DECLARE_INTERFACE_(IDataModelScriptDebugBreakpointEnumerator, IUnknown)
{
   STDMETHOD(Reset)() PURE;
   STDMETHOD(GetNext)(_COM_Outptr_ IDataModelScriptDebugBreakpoint **breakpoint) PURE;
}

Återställ

Metoden Återställ återställer positionen för uppräknaren till den plats där den var strax efter att uppräknaren skapades , det vill sa innan den första uppräknade brytpunkten.

GetNext

Metoden GetNext flyttar uppräknaren framåt till nästa brytpunkt för att räknas upp och returnerar gränssnittet IDataModelScriptDebugBreakpoint för brytpunkten. Om uppräknaren har nått slutet av uppräkningen returneras E_BOUNDS. När E_BOUNDS-felet har skapats fortsätter efterföljande anrop till metoden GetNext att producera E_BOUNDS såvida inte ett mellanliggande anrop till metoden Återställ har gjorts.


Se även

Det här avsnittet är en del av en serie som beskriver de gränssnitt som är tillgängliga från C++, hur du använder dem för att skapa ett C++-baserat felsökningstillägg och hur du använder andra datamodellkonstruktioner (t.ex. JavaScript eller NatVis) från ett C++-datamodelltillägg.

Felsökningsdatamodell C++ Översikt

Felsökarens C++-gränssnitt för datamodell

Felsöka datamodell C++-objekt

Felsökningsdatamodell C++ Ytterligare gränssnitt

Felsökningsdatamodell C++ Begrepp