Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Ez a témakör azt ismerteti, hogyan használható a Hibakereső adatmodell C++ Hibakereső adatmodell C++ szkriptelése a hibakereső motor automatizálásának támogatásához szkriptek használatával.
szkriptkezelés a Hibakereső adatmodellben
A Data Model Manager az objektumlétrehozás és a bővíthetőség központi hatóságaként betöltött szerepe mellett a szkriptek absztrakt koncepciójának felügyeletéért is felelős. Az Adatmodell-kezelő Szkriptkezelő része szempontjából a szkriptek dinamikusan betölthetők, kiüríthetők és potenciálisan hibakeresést végezhetnek az adatmodell új funkcióinak bővítése vagy biztosítása érdekében.
A szkriptszolgáltató olyan összetevő, amely hidat képez egy nyelvhez (például NatVis, JavaScript stb.) az adatmodellhez. Egy vagy több fájlkiterjesztést regisztrál (pl. ". NatVis", ".js"), amelyeket a szolgáltató kezel, amely lehetővé teszi a hibakereső ügyfél vagy egy felhasználói felület számára, hogy lehetővé tegye a szkriptfájlok betöltését az adott kiterjesztéssel a szolgáltatóhoz delegálás útján.
A Core Script Manager: IDataModelScriptManager
Az alapvető szkriptkezelő felület a következőképpen van definiálva.
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;
}
A GetDefaultNameBinder metódus visszaadja az adatmodell alapértelmezett szkriptnév-kötését. A névkötő egy olyan összetevő, amely felold egy nevet egy objektum környezetében. Például a "foo.bar" kifejezés miatt a rendszer egy névkötőt hív meg a névsáv feloldásához az objektum foo környezetében. Az itt visszaadott iratgyűjtő az adatmodell alapértelmezett szabályait követi. A szkriptszolgáltatók ezzel az iratgyűjtővel konzisztenciát biztosíthatnak a névfeloldásban a szolgáltatók között.
A RegisterScriptProvider metódus tájékoztatja az adatmodellt, hogy létezik egy új szkriptszolgáltató, amely képes áthidalni egy új nyelvet az adatmodellhez. A metódus meghívása után a szkriptkezelő azonnal visszahívja az adott szkriptszolgáltatót, és érdeklődik az általa kezelt szkriptek tulajdonságairól. Ha már van regisztrálva egy szolgáltató a megadott szkriptszolgáltató által jelzett név vagy fájlkiterjesztés alatt, ez a metódus sikertelen lesz. Egy adott név vagy fájlkiterjesztés kezelőjeként csak egyetlen szkriptszolgáltató regisztrálható.
AScriptProvider- regisztrálásának törlése
A Regisztráció törléseScriptProvider metódus visszavonja a RegisterScriptProvider metódus hívását. Az áthatolt szkriptszolgáltató által megadott név és fájlkiterjesztés a továbbiakban nem lesz társítva. Fontos megjegyezni, hogy a szkriptszolgáltatóra a regisztráció törlése után is jelentős számú, a szkriptszolgáltatóra mutató, függőben lévő COM-hivatkozás lehet. Ez a módszer csak az adott szkriptszolgáltató által kezelt típusú szkriptek betöltését/létrehozását akadályozza meg. Ha az adott szolgáltató által betöltött szkript továbbra is betöltve van, vagy manipulálta a hibakereső (vagy adatmodell) objektummodellét, ezek a manipulációk továbbra is hivatkozhatnak a szkriptre. Lehetnek olyan adatmodellek, metódusok vagy objektumok, amelyek közvetlenül hivatkoznak a szkript szerkezetére. A szkriptszolgáltatónak készen kell állnia arra, hogy ezzel foglalkozzon.
A FindProviderForScriptType metódus megkeresi a szkriptkezelőt egy olyan szolgáltatónál, amelynek szkripttípus-sztringje van a metódusban leírtak szerint. Ha egy nem található, ez a metódus sikertelen lesz; ellenkező esetben az ilyen szkriptszolgáltató vissza lesz adva a hívónak.
Az EnumerateScriptProviders metódus egy enumerátort ad vissza, amely a RegisterScriptProvider metódus előzetes hívásával számba veszi a szkriptkezelőben regisztrált összes szkriptszolgáltatót.
szkriptszolgáltató enumerálása: IDataModelScriptProviderEnumerator
Az EnumerateScriptProviders metódus az alábbi űrlap enumerátorát adja vissza:
DECLARE_INTERFACE_(IDataModelScriptProviderEnumerator, IUnknown)
{
STDMETHOD(Reset)() PURE;
STDMETHOD(GetNext)(_COM_Outptr_ IDataModelScriptProvider **provider) PURE;
}
Az Alaphelyzetbe állítási módszer az enumerátort az első elem visszaadása előtti pozícióba helyezi át.
A GetNext metódus áthelyezi az enumerátort egy elemet, és visszaadja az adott elemhez tartozó szkriptszolgáltatót. Amikor az enumerátor eléri az enumerálás végét, a rendszer E_BOUNDS ad vissza. A GetNext metódus meghívása a hiba beérkezése után is E_BOUNDS határozatlan ideig fog visszatérni.
Hibakereső adatmodell C++ gazdafelületei szkripteléshez
A gazdagép szerepköre a szkriptelési
A hibakeresési gazdagép nagyon alacsony szintű interfészek sorozatát teszi elérhetővé a hibakeresési cél(ok) típusrendszerének megértéséhez, a kifejezések kiértékeléséhez a hibakeresési cél(ok) nyelvén stb. Általában nem rendelkezik magasabb szintű szerkezetekkel, például szkriptekkel. Ez az általános hibakereső alkalmazásra vagy az ezeket a képességeket biztosító bővítményekre marad. Ez alól azonban kivétel van. Minden hibakeresési gazdagépnek, amely részt szeretne venni az adatmodell által biztosított általános szkriptelési élményben, néhány egyszerű felületet kell implementálnia, hogy kontextusokat biztosítson a szkripteknek. Valójában a hibakeresési gazdagép szabályozza, hogy a szkriptelési környezet hol helyezzen el függvényeket és más szkripttel biztosított funkciókat az adatmodell névterében. Ha részt vesz ebben a folyamatban, a gazdagép engedélyezheti (vagy nem) az ilyen függvények használatát például a kifejezésértékelőben. A gazdagép szempontjából érintett felületek a következők:
A hibakeresési gazdagép szkriptgazda: IDebugHostScriptHost
Az IDebugHostScriptHost felület az a felület, amelyet egy szkriptszolgáltató használ az újonnan létrehozott szkript hibakeresési gazdagépének környezetének lekéréséhez. Ez a környezet tartalmaz egy objektumot (amelyet a hibakeresési gazdagép biztosít), ahol a szkriptszolgáltató bármilyen hidat helyezhet el az adatmodell és a szkriptelési környezet között. Ilyen hidak lehetnek például olyan adatmodell-metódusok, amelyek szkriptfüggvényeket hívnak meg. Ezzel lehetővé teszi, hogy az adatmodell oldalán lévő hívó szkriptmetódusokat hívjon meg az IModelMethod interfész hívási metódusának használatával.
Az IDebugHostScriptHost felület a következőképpen van definiálva.
DECLARE_INTERFACE_(IDebugHostScriptHost, IUnknown)
{
STDMETHOD(CreateContext)(_In_ IDataModelScript* script, _COM_Outptr_ IDataModelScriptHostContext** scriptContext) PURE;
}
A CreateContext metódust egy szkriptszolgáltató meghívja egy új környezet létrehozásához, amelyben elhelyezheti a szkript tartalmát. Az ilyen környezetet az IDataModelScriptHostContext felület képviseli, amelyet részletesen ismertet az adatmodell C++ szkriptelési felületei oldalon.
Hibakereső adatmodell C++ szkriptelési felületei
parancsfájl- és szkriptfelületek
Az adatmodell általános architektúrája lehetővé teszi, hogy egy harmadik fél hidat definiáljon az adatmodell bizonyos nyelve és objektummodellje között. Az áthidalt nyelv általában szkriptnyelv, mivel az adatmodell környezete nagyon dinamikus. A nyelv és az adatmodell objektummodellje közötti hidat definiáló és megvalósító összetevőt szkriptszolgáltatónak nevezzük. Inicializáláskor a szkriptszolgáltató regisztrálja magát az adatmodell-kezelő szkriptkezelőjénél, és a bővíthetőséget kezelő bármely felület lehetővé teszi a szkriptek szerkesztését, betöltését, eltávolítását és esetleges hibakeresését a szkriptszolgáltató által kezelt nyelven.
Vegye figyelembe, hogy a Windows hibakeresési eszközei jelenleg két szkriptszolgáltatót határoznak meg.
- A NatVis-szolgáltató. Ez a szolgáltató a NatVis XML és az adatmodellek közötti DbgEng.dll és hidakba van beágyazva, lehetővé téve az natív/nyelvi adattípusok vizualizációját.
- A JavaScript-szolgáltató. Ez a szolgáltató egy régi hibakereső bővítményben található: JsProvider.dll. Hidat képez a JavaScript nyelven írt szkriptek és az adatmodell között, lehetővé téve a hibakeresők vezérlésének és bővíthetőségének tetszőleges formáit.
Új szolgáltatókat lehet írni, amelyek más nyelveket (például: Pythont stb.) hidat képeznek az adatmodellhez. Ez jelenleg a régi hibakereső bővítményekbe ágyazható be betöltési célokra. Magának a szkriptszolgáltatónak az örökölt motorfelületekkel kell minimalizálnia a függőséget, és csak akkor kell használnia az adatmodell API-kat, ha lehetséges. Ez lehetővé teszi, hogy a szolgáltatót más környezetekbe is hordozhatóvá tegyék jelentősen egyszerűbben.
A szkriptszolgáltatókhoz két interfészosztály kapcsolódik. Az interfészek első osztálya a szkriptszolgáltatók és az általuk kezelt szkriptek általános kezelésére használható. Az interfészek második osztálya a szkriptek hibakeresésének támogatására használható. Bár az első készlet támogatása kötelező, a második támogatása nem kötelező, és nem feltétlenül minden szolgáltatónak van értelme.
Az általános felügyeleti felületek a következők:
| Interfész | Leírás |
|---|---|
| IDataModelScriptProvider | A szkriptszolgáltató által implementálandó alapvető felület. Ez az a felület, amely regisztrálva van az adatmodell-kezelő szkriptkezelőjében annak érdekében, hogy meghirdetje egy adott típusú szkript szolgáltatói támogatását, és regisztráljon egy adott fájlkiterjesztésen |
| IDataModelScript | Egy adott szkript absztrakciója, amelyet a szolgáltató felügyel. Minden betöltött vagy szerkesztett szkriptnek külön IDataModelScript-példánya van |
| IDataModelScriptClient | Egy ügyféloldali felület, amelyet a szkriptszolgáltató használ a felhasználói felület információinak közléséhez. A szkriptszolgáltatók nem implementálják ezt a felületet. Az adatmodellt üzemeltető alkalmazás, amely szkriptszolgáltatókat kíván használni, igen. A szkriptszolgáltató meghívja a szkriptügyfél metódusait az állapot, hibák stb. jelentéséhez... |
| IDataModelScriptHostContext | A szkriptszolgáltató által a szkript tartalmának tárolójaként használt gazdafelület. A hibakereső alkalmazás objektummodelljével végzett manipulációktól eltérő szkriptfelület tartalma az adott hibakereső gazdagépen múlik. Ez a felület lehetővé teszi, hogy a szkriptszolgáltató információt kapjon arról, hogy hol helyezze el a tartalmát. |
| IDataModelScriptTemplate | A szkriptszolgáltatók egy vagy több sablont biztosíthatnak, amelyek kiindulópontként szolgálnak a felhasználók számára a szkriptek létrehozásához. A beépített szerkesztőt biztosító hibakereső alkalmazás előre kitöltheti az új szkripteket sablontartalommal, ahogy azt a szolgáltató ezen a felületen hirdeti. |
| IDataModelScriptTemplateEnumerator | A szkriptszolgáltató által implementálandó enumerátori felület, amellyel meghirdetheti az általa támogatott összes sablont. |
| IDataModelNameBinder | Névkötő – olyan objektum, amely társíthat egy nevet egy környezetben egy értékhez. Egy adott kifejezés, például a "foo.bar" esetében a névkötő meg tudja kötni a "bar" nevet a "foo" objektum kontextusában, és létrehoz egy értéket vagy hivatkozik rá. A névkötőket általában nem egy szkriptszolgáltató implementálja; ehelyett az alapértelmezett iratgyűjtőt az adatmodellből szerezheti be, és a szkriptszolgáltató használhatja |
A hibakeresési felületek a következők:
| Interfész | Leírás |
|---|---|
| IDataModelScriptDebug | A szkriptszolgáltató által a szkriptek hibakereséséhez szükséges alapvető felület. Ha a szkript hibakeresésre alkalmas, az IDataModelScript interfész implementációs osztályának QueryInterface for IDataModelScriptDebug típusúnak kell lennie. |
| IDataModelScriptDebugClient | Az IDataModelScriptDebugClient felületet az a felhasználói felület valósítja meg, amely lehetővé szeretné tenni a szkript hibakeresését. A szkriptszolgáltató ezt a felületet használja a hibakeresési információk oda-vissza továbbításához (például: események, töréspontok stb.) |
| IDataModelScriptDebugStack | A szkriptszolgáltató implementálja ezt az felületet, hogy elérhetővé tegye a hívásverem fogalmát a szkript hibakeresőjének. |
| IDataModelScriptDebugStackFrame | A szkriptszolgáltató implementálja ezt az interfészt, hogy elérhetővé tegye egy adott veremkeret fogalmát a hívásveremen belül. |
| IDataModelScriptDebugVariableSetEnumerator | A szkriptszolgáltató ezt az felületet implementálja változók egy halmazának elérhetővé megvalósításához. Ez a készlet egy függvény paraméterkészletét, a helyi változók készletét vagy egy adott hatókörön belüli változókészletet jelölheti. A pontos jelentés az interfész beszerzésétől függ. |
| IDataModelScriptDebugBreakpoint | A szkriptszolgáltató implementálja ezt az interfészt, hogy elérhetővé tegye egy adott töréspont fogalmát és vezérlését a szkripten belül. |
| IDataModelScriptDebugBreakpointEnumerator | A szkriptszolgáltató ezt implementálja a szkriptben jelenleg létező összes töréspont számbavételéhez (függetlenül attól, hogy engedélyezve van-e vagy sem). |
Alapvető szkriptszolgáltató: IDataModelScriptProvider
Minden olyan bővítménynek, amely szkriptszolgáltató szeretne lenni, biztosítania kell az IDataModelScriptProvider felület implementálását, és regisztrálnia kell az adatmodell-kezelő szkriptkezelőjéhez a RegisterScriptProvider metóduson keresztül. Ezt az alapvető felületet, amelyet végre kell hajtani, az alábbiak szerint kell meghatározni.
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;
}
A GetName metódus annak a szkripttípusnak (vagy nyelvnek) a nevét adja vissza, amelyet a szolgáltató a SysAllocString metódussal lefoglalt sztringként kezel. A hívó felelős a visszaadott sztring SysFreeStringen keresztüli felszabadításáért. Az ebből a metódusból visszaadható sztringek például a "JavaScript" vagy a "NatVis". A visszaadott sztring valószínűleg megjelenik az adatmodellt üzemeltető hibakereső alkalmazás felhasználói felületén. Egyetlen két szkriptszolgáltató sem adja vissza ugyanazt a nevet (a kis- és nagybetűk nem érzéketlenek).
A GetExtension metódus a SysAllocString metódussal lefoglalt sztringként adja vissza a szolgáltató által felügyelt szkriptek fájlkiterjesztését (pont nélkül). Az adatmodellt üzemeltető hibakereső alkalmazás (a szkriptek támogatásával) delegálja az ilyen kiterjesztésű szkriptfájlok megnyitását a szkriptszolgáltatónak. A hívó felelős a visszaadott sztring SysFreeStringen keresztüli felszabadításáért. Az ebből a metódusból visszaadható sztringek például a "js" vagy a "NatVis".
A Rendszer meghívja a CreateScript metódust egy új szkript létrehozásához. A szkriptszolgáltatónak egy új és üres szkriptet kell visszaadnia, amelyet a visszaadott IDataModelScript felület jelöl, amikor ezt a metódust meghívják. Vegye figyelembe, hogy ezt a metódust a rendszer meghívja, függetlenül attól, hogy a felhasználói felület új üres szkriptet hoz-e létre a felhasználó szerkesztéséhez, vagy hogy a hibakereső alkalmazás betölt egy szkriptet a lemezről. A szolgáltató nem vesz részt az I/O fájlban. Csupán az IDataModelScript metódusainak átadott streameken keresztül kezeli az üzemeltetési alkalmazástól érkező kéréseket.
A GetDefaultTemplateContent metódus egy felületet ad vissza a szolgáltató alapértelmezett sablontartalmához. Ezt a tartalmat szeretné a szkriptszolgáltató előre kitölteni egy szerkesztési ablakban egy újonnan létrehozott szkripthez. Ha a szkriptszolgáltató nem rendelkezik sablonokkal (vagy nem rendelkezik az alapértelmezett tartalomként kijelölt sablontartalommal), a szkriptszolgáltató ebből a módszerből E_NOTIMPL adhat vissza.
Az EnumerateTemplates metódus egy enumerátort ad vissza, amely képes a szkriptszolgáltató által biztosított sablonok számbavételére. A sablon tartalma az, amelyet a szkriptszolgáltató egy szerkesztési ablakban szeretne "előre kitölteni" egy új szkript létrehozásakor. Ha több különböző sablon is támogatott, ezek a sablonok elnevezhetők (pl. "Imperatív szkript", "Bővítményszkript"), és az adatmodellt üzemeltető hibakereső alkalmazás kiválaszthatja, hogyan jelenítheti meg a "sablonokat" a felhasználónak.
Alapvető szkriptfelület: IDataModelScript
A szolgáltató által implementált egyedi szkripteket kezelő fő felület az IDataModelScript felület. Ha az ügyfél új üres szkriptet szeretne létrehozni, és meghívja a CreateScript metódust az IDataModelScriptProvideren, a rendszer visszaadja a felületet implementáló összetevőt.
A szolgáltató által létrehozott összes szkriptnek független silóban kell lennie. Az egyik szkriptnek nem lehet hatása egy másik szkriptre, kivéve az adatmodellen keresztüli külső objektumokkal való explicit interakciót. Két szkript például kiterjeszthet valamilyen típust vagy fogalmat (például a hibakereső elképzelése arról, hogy mi az a folyamat). Ezután bármelyik szkript hozzáférhet egymás mezőihez a külső folyamatobjektumon keresztül.
Az interfész a következőképpen van definiálva.
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;
}
A GetName metódus a sysAllocString függvényen keresztül lefoglalt sztringként adja vissza a szkript nevét. Ha a szkriptnek még nincs neve, a metódusnak null BSTR-t kell visszaadnia. Ebben a helyzetben nem hiúsul meg. Ha a szkriptet explicit módon átnevezik az Átnevezési metódus hívásával, a GetName metódusnak az újonnan hozzárendelt nevet kell visszaadnia.
Az Átnevezés metódus új nevet rendel a szkripthez. A szkript implementációjának feladata a név mentése és visszaadása a GetName metódus bármilyen hívása esetén. Ezt gyakran akkor hívják meg, ha a felhasználói felület a Mentés másként parancsprogramot választja egy új névre. Vegye figyelembe, hogy a szkript átnevezése hatással lehet arra, hogy az üzemeltetési alkalmazás hol szeretné kivetíteni a szkript tartalmát.
A Feltöltés metódust az ügyfél hívja meg a szkript "tartalmának" módosításához vagy szinkronizálásához. A szkriptszolgáltató értesítése arról, hogy a szkript kódja megváltozott. Fontos megjegyezni, hogy ez a módszer nem okozza a szkript végrehajtását vagy a szkript által manipulált objektumok módosítását. Ez csupán egy értesítés a szkriptszolgáltatónak arról, hogy a szkript tartalma megváltozott, így szinkronizálhatja a saját belső állapotát.
Az Execute metódus végrehajtja a szkript tartalmát az utolsó sikeres feltöltési hívás által diktált módon, és ennek megfelelően módosítja a hibakereső objektummodellét. Ha a nyelv (vagy a szkriptszolgáltató) meghatároz egy "fő függvényt", amelyet a szerző egy képzeletbeli "Szkript végrehajtása" gombra való kattintáskor hívna meg egy felhasználói felületen , akkor az ilyen "fő függvény" nem lesz meghívva végrehajtási művelet során. A Végrehajtási művelet csak inicializálási és objektummodell-manipulációk végrehajtásának tekinthető (például a gyökérkód végrehajtása és a bővíthetőségi pontok beállítása).
A Leválasztási metódus visszavonja a Végrehajtás műveletet. A szkript végrehajtása során létrehozott objektummodell-manipulációk vagy bővíthetőségi pontok visszavonásra kerülnek. A leválasztási művelet után előfordulhat, hogy a szkript újrafuttatható a Végrehajtás hívásával, vagy felszabadítható.
Az IsInvocable metódus azt adja vissza, hogy a szkript visszavonhatatlan-e, vagyis hogy rendelkezik-e a nyelv vagy a szolgáltató által meghatározott "fő függvénnyel". Egy ilyen "fő függvény" fogalmilag olyasmi, amit a szkript szerzője el szeretne hívni, ha egy képzeletbeli "Szkript végrehajtása" gombot lenyomnának egy felhasználói felületen.
Ha a szkript rendelkezik egy "fő függvénnyel", amely egy felhasználói felületi meghívásból való végrehajtásra szolgál, azt az IsInvocable metódus valódi visszatérésével jelzi. A felhasználói felület ezután meghívhatja az InvokeMain metódust a szkript tényleges "meghívására". Vegye figyelembe, hogy ez eltér Végrehajtás, amely az összes gyökérkódot futtatja, és hidat képez a szkriptnek a mögöttes gazdagép névteréhez.
**A szkriptügyfél: IDataModelScriptClient **
Az adatmodellt üzemeltető alkalmazás, amely szkripteket szeretne kezelni, és rendelkezik egy felhasználói felülettel (akár grafikus, akár konzol) a fogalma körül, implementálja az IDataModelScriptClient felületet. Ezt a felületet a rendszer a végrehajtás, a meghívás vagy egy szkript során bármely szkriptszolgáltatónak átadja annak érdekében, hogy hiba- és eseményinformációkat továbbíthasson a felhasználói felületnek.
Az IDataModelScriptClient felület a következőképpen van definiálva.
DECLARE_INTERFACE_(IDataModelScriptClient, IUnknown)
{
STDMETHOD(ReportError)(_In_ ErrorClass errClass, _In_ HRESULT hrFail, _In_opt_ PCWSTR message, _In_ ULONG line, _In_ ULONG position) PURE;
}
Ha a szkript végrehajtása vagy meghívása során hiba történik, a szkriptszolgáltató meghívja a ReportError metódust, hogy értesítse a felhasználói felületet a hibáról.
Szkript gazdagépkörnyezete: IDataModelScriptHostContext
A hibakeresési gazdagépnek van némi befolyása az adatmodell-szkript tartalmának és a projektjének módjára és helyére. A szkriptek várhatóan egy olyan környezetet kérnek a gazdagéptől, amelyben hidakat helyeznek el a szkripthez (például: meghívható függvényobjektumok stb.). Ez a környezet az IDebugHostScriptHost CreateContext metódusának meghívásával és egy IDataModelScriptHostContext beolvasásával kérhető le.
Az IDataModelScriptHostContext interfész a következőképpen van definiálva.
DECLARE_INTERFACE_(IDataModelScriptHostContext, IUnknown)
{
STDMETHOD(NotifyScriptChange)(_In_ IDataModelScript* script, _In_ ScriptChangeKind changeKind) PURE;
STDMETHOD(GetNamespaceObject)(_COM_Outptr_ IModelObject** namespaceObject) PURE;
}
A szkriptszolgáltatónak értesítenie kell a hibakeresési gazdagépet a társított környezetben a NotifyScriptChange metódus metódushívásával végrehajtott bizonyos műveletekről. Az ilyen műveletek a ScriptChangeKind enumerálás tagjaiként vannak definiálva
A GetNamespaceObject metódus egy objektumot ad vissza, amelybe a szkriptszolgáltató bármilyen hidat helyezhet el az adatmodell és a szkript között. Itt van például az, hogy a szkriptszolgáltató adatmodellmetódus-objektumokat (IModelMethod-interfészeket) helyez el az IModelObject-ben, amelyek implementációja meghívja a szkript megfelelő nevű függvényeit.
újonnan létrehozott szkriptek sablonjai: IDataModelScriptTemplate
Azok a szkriptszolgáltatók, amelyek előre kitöltött tartalmakat szeretnének megjeleníteni az új szkriptekhez (például a szkriptek hibakereső felhasználói felületén való írásának támogatásához) ezt megtehetik egy vagy több szkriptsablon biztosításával. Az ilyen sablonok olyan összetevők, amelyek az IDataModelScriptTemplate felületet implementálják, és a getDefaultTemplate metódus vagy az EnumerateTemplates metódus használatával adják vissza a szkriptszolgáltatón.
Az IDataModelScriptTemplate felület a következőképpen van definiálva.
DECLARE_INTERFACE_(IDataModelScriptTemplate, IUnknown)
{
STDMETHOD(GetName)(_Out_ BSTR *templateName) PURE;
STDMETHOD(GetDescription)(_Out_ BSTR *templateDescription) PURE;
STDMETHOD(GetContent)(_COM_Outptr_ IStream **contentStream) PURE;
}
A GetName metódus a sablon nevét adja vissza. Ez E_NOTIMPL sikertelen lehet, ha a sablonnak nincs neve. Az egyetlen alapértelmezett sablonnak (ha létezik ilyen) nincs szükség névre. Minden más sablon. Ezek a nevek megjelenhetnek a felhasználói felületen egy menü részeként, amely kiválasztja, hogy melyik sablont szeretné létrehozni.
A GetDescription metódus a sablon leírását adja vissza. Ez a leírás leíróbb felületeken jelenik meg a felhasználó számára, hogy segítsen a felhasználónak megérteni a sablon rendeltetését. Ha nem rendelkezik leírással, a sablon visszaadhat E_NOTIMPL ebből a módszerből.
A GetContent metódus a sablon tartalmát (vagy kódját) adja vissza. Ez az, amit előre kitöltene a szerkesztési ablakban, ha egy felhasználó úgy döntött, hogy új szkriptet hoz létre ebből a sablonból. A sablon feladata egy szabványos stream létrehozása (és visszaadása) az ügyfél által lekérhető tartalomon keresztül.
Szolgáltatói sablontartalom számbavétele: IDataModelScriptTemplateEnumerator
A szkriptszolgáltató egy vagy több sablont biztosíthat, amelyek előre kitöltik a tartalmat az újonnan létrehozott szkriptekbe bizonyos felhasználói felületen. Ha a sablonok bármelyike rendelkezésre áll, a szkriptszolgáltatónak enumerátort kell implementálnia felette, amelyet az EnumerateTemplates metódus hívása után ad vissza.
Az ilyen enumerátor az IDataModelScriptTemplateEnumerator felület implementációja, és a következőképpen van definiálva.
DECLARE_INTERFACE_(IDataModelScriptTemplateEnumerator, IUnknown)
{
STDMETHOD(Reset)() PURE;
STDMETHOD(GetNext)(_COM_Outptr_ IDataModelScriptTemplate **templateContent) PURE;
}
Az Alaphelyzetbe állítási módszer visszaállítja az enumerátort arra a pozícióra, ahol az első létrehozásakor volt – az első sablon létrehozása előtt.
A GetNext metódus áthelyezi az enumerátort a következő sablonba, és visszaadja. Az enumerálás végén az enumerátor E_BOUNDS ad vissza. A E_BOUNDS jelölő találata után az enumerátor továbbra is határozatlan ideig E_BOUNDS hibákat eredményez, amíg alaphelyzetbe nem állítja a hívást.
Nevek jelentésének feloldása: IDataModelNameBinder
Az adatmodell szabványos módot biztosít a szkriptszolgáltatók számára egy adott név jelentésének meghatározására egy adott kontextusban (például annak meghatározására, hogy milyen sávot jelent a foo.bar), amely számos szkriptszolgáltatón fog működni. Ez a mechanizmus névkötőként ismert, és az IDataModelNameBinder interfész képviseli. Az ilyen kötőanyagok olyan szabályok készletét foglalják össze, hogy a név hogyan oldható fel, és hogyan kezelhető az ütközésfeloldás, ha egy név többször van definiálva egy objektumon. A szabályok közé tartoznak például az előrejelzett nevek (egy adatmodell által hozzáadott) feloldása natív névvel (a hibakeresés alatt álló nyelv típusrendszerében).
Annak érdekében, hogy bizonyos fokú konzisztenciát biztosítson a szkriptszolgáltatók között, az adatmodell szkriptkezelője egy alapértelmezett névkötőt biztosít". Ez az alapértelmezett névkötő az IDataModelScriptManager interfész GetDefaultNameBinder metódusának hívásával szerezhető be. A névkötő felülete a következőképpen van definiálva.
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;
}
A BindValue metódus a kötési szabályok halmaza szerint elvégzi az adott objektumon a contextObject.name megfelelőjeként. A kötés eredménye egy érték. Értékként a mögöttes szkriptszolgáltató nem használhatja az értéket a névre való hozzárendelés végrehajtásához.
A BindReference metódus hasonló a BindValue-hoz, mivel a kötési szabályok szerint az adott objektumon a contextObject.name megfelelője is. A metódus kötésének eredménye azonban nem érték, hanem hivatkozás. Hivatkozásként a szkriptszolgáltató felhasználhatja a hivatkozást a névre való hozzárendelés végrehajtásához.
Az EnumerateValues metódus számba veszi azokat a neveket és értékeket, amelyek a BindValue metódus szabályai szerint kötődnek az objektumhoz. Az EnumerateKeys, az EnumerateValues és az IModelObject hasonló metódusaival ellentétben, amelyek több azonos értékű nevet is visszaadhatnak (alaposztályokhoz, szülőmodellekhez és hasonlókhoz), ez az enumerátor csak az adott névkészletet adja vissza, amely a BindValue és a BindReference függvényhez kötődik. A nevek soha nem lesznek duplikálva. Vegye figyelembe, hogy az objektumok névkötőn keresztül történő számbavétele jelentősen magasabb költséggel jár, mint az IModelObject metódusok meghívása.
Az EnumerateReferences metódus számba veszi azokat a neveket és hivatkozásokat, amelyek a BindReference metódus szabályai szerint kötődnek az objektumhoz. Az EnumerateKeys, az EnumerateValues és az IModelObject hasonló metódusaival ellentétben, amelyek több azonos értékű nevet is visszaadhatnak (alaposztályokhoz, szülőmodellekhez és hasonlókhoz), ez az enumerátor csak az adott névkészletet adja vissza, amely a BindValue és a BindReference függvényhez kötődik. A nevek soha nem lesznek duplikálva. Vegye figyelembe, hogy az objektumok névkötőn keresztül történő számbavétele jelentősen magasabb költséggel jár, mint az IModelObject metódusok meghívása.
Hibakereső adatmodell C++ szkript hibakeresési felületei
Az adatmodell szkriptszolgáltatóinak infrastruktúrája a szkriptek hibakeresésével kapcsolatos fogalmat is biztosít. Minden olyan szkript, amely hibakeresési képességeket kíván elérhetővé tenni a hibakereső gazdagép és az adatmodellt üzemeltető hibakereső alkalmazás számára, ezt úgy teheti meg, hogy a hibakereső szkriptek az IDataModelScriptDebug felületet az IDataModelScript interfész mellett implementálják. Ennek a felületnek a jelenléte a szkripten azt jelzi az infrastruktúrának, hogy hibakereső.
Bár az IDataModelScriptDebug felület a kiindulási pont egy szkriptszolgáltató hibakeresési képességeihez való hozzáféréshez, más felületek is csatlakoznak hozzá, amelyek általános hibakeresési képességeket biztosítanak.
A hibakeresési felületek a következők:
| Interfész | Leírás |
|---|---|
| IDataModelScriptDebug | A szkriptszolgáltató által a szkriptek hibakereséséhez szükséges alapvető felület. Ha a szkript hibakeresésre alkalmas, az IDataModelScript interfész implementációs osztályának QueryInterface for IDataModelScriptDebug típusúnak kell lennie. |
| IDataModelScriptDebugClient | Az IDataModelScriptDebugClient felületet az a felhasználói felület valósítja meg, amely lehetővé szeretné tenni a szkript hibakeresését. A szkriptszolgáltató ezt a felületet használja a hibakeresési információk oda-vissza továbbításához (például: események, töréspontok stb.) |
| IDataModelScriptDebugStack | A szkriptszolgáltató implementálja ezt az felületet, hogy elérhetővé tegye a hívásverem fogalmát a szkript hibakeresőjének. |
| IDataModelScriptDebugStackFrame | A szkriptszolgáltató implementálja ezt az interfészt, hogy elérhetővé tegye egy adott veremkeret fogalmát a hívásveremen belül. |
| IDataModelScriptDebugVariableSetEnumerator | A szkriptszolgáltató ezt az felületet implementálja változók egy halmazának elérhetővé megvalósításához. Ez a készlet egy függvény paraméterkészletét, a helyi változók készletét vagy egy adott hatókörön belüli változókészletet jelölheti. A pontos jelentés az interfész beszerzésétől függ. |
| IDataModelScriptDebugBreakpoint | A szkriptszolgáltató implementálja ezt az interfészt, hogy elérhetővé tegye egy adott töréspont fogalmát és vezérlését a szkripten belül. |
| IDataModelScriptDebugBreakpointEnumerator | A szkriptszolgáltató ezt implementálja a szkriptben jelenleg létező összes töréspont számbavételéhez (függetlenül attól, hogy engedélyezve van-e vagy sem). |
Az általános felügyeleti felületek a következők:
| Interfész | Leírás |
|---|---|
| IDataModelScriptProvider | A szkriptszolgáltató által implementálandó alapvető felület. Ez az a felület, amely regisztrálva van az adatmodell-kezelő szkriptkezelőjében annak érdekében, hogy meghirdetje egy adott típusú szkript szolgáltatói támogatását, és regisztráljon egy adott fájlkiterjesztésen |
| IDataModelScript | Egy adott szkript absztrakciója, amelyet a szolgáltató felügyel. Minden betöltött vagy szerkesztett szkriptnek külön IDataModelScript-példánya van |
| IDataModelScriptClient | Egy ügyféloldali felület, amelyet a szkriptszolgáltató használ a felhasználói felület információinak közléséhez. A szkriptszolgáltatók nem implementálják ezt a felületet. Az adatmodellt üzemeltető alkalmazás, amely szkriptszolgáltatókat kíván használni, igen. A szkriptszolgáltató meghívja a szkriptügyfél metódusait az állapot, hibák stb. jelentéséhez... |
| IDataModelScriptHostContext | A szkriptszolgáltató által a szkript tartalmának tárolójaként használt gazdafelület. A hibakereső alkalmazás objektummodelljével végzett manipulációktól eltérő szkriptfelület tartalma az adott hibakereső gazdagépen múlik. Ez a felület lehetővé teszi, hogy a szkriptszolgáltató információt kapjon arról, hogy hol helyezze el a tartalmát. |
| IDataModelScriptTemplate | A szkriptszolgáltatók egy vagy több sablont biztosíthatnak, amelyek kiindulópontként szolgálnak a felhasználók számára a szkriptek létrehozásához. A beépített szerkesztőt biztosító hibakereső alkalmazás előre kitöltheti az új szkripteket sablontartalommal, ahogy azt a szolgáltató ezen a felületen hirdeti. |
| IDataModelScriptTemplateEnumerator | A szkriptszolgáltató által implementálandó enumerátori felület, amellyel meghirdetheti az általa támogatott összes sablont. |
| IDataModelNameBinder | Névkötő – olyan objektum, amely társíthat egy nevet egy környezetben egy értékhez. Egy adott kifejezés, például a "foo.bar" esetében a névkötő meg tudja kötni a "bar" nevet a "foo" objektum kontextusában, és létrehoz egy értéket vagy hivatkozik rá. A névkötőket általában nem egy szkriptszolgáltató implementálja; ehelyett az alapértelmezett iratgyűjtő az adatmodellből szerezhető be, és a szkriptszolgáltató használhatja. |
Szkriptek hibakeresése: IDataModelScriptDebug
A hibakereső szkriptek ezt a képességet jelzik az IDataModelScriptDebug felület jelenlétével ugyanazon az összetevőn, amely az IDataModelScriptet implementálja. A hibakereső gazdagép vagy az adatmodellt üzemeltető hibakereső alkalmazás által erre az interfészre vonatkozó lekérdezés jelzi a hibakeresési képesség meglétét.
Az IDataModelScriptDebug felület a következőképpen van definiálva.
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;
}
A GetDebugState metódus a szkript aktuális állapotát adja vissza (például azt, hogy végrehajtja-e vagy sem). Az állapotot a ScriptDebugState enumeráláson belüli érték határozza meg.
A GetCurrentPosition metódus a szkript aktuális pozícióját adja vissza. Ez csak akkor hívható meg, ha a szkript be van törve abba a hibakeresőbe, ahol a GetScriptState hívása a ScriptDebugBreaket adja vissza. A metódus bármely más hívása érvénytelen, és sikertelen lesz.
A GetStack metódus a törés pozícióban lekéri az aktuális hívásvermet. Ez a metódus csak akkor hívható meg, ha a szkript a hibakeresőre van bontva.
A SetBreakpoint metódus beállít egy töréspontot a szkripten belül. Vegye figyelembe, hogy az implementáció szabadon módosíthatja az áthatolt sor- és oszlophelyzeteket, hogy előrelépjen a megfelelő kódhelyzetre. A töréspont tényleges sor- és oszlopszámai a visszaadott IDataModelScriptDebugBreakpoint felület metódushívásokkal kérhetők le.
A szkriptben a SetBreakpoint metódussal létrehozott minden törésponthoz egyedi azonosítót (egy 64 bites aláíratlan egész számot) rendel a implementáció. A FindBreakpointById metódussal egy adott azonosítóból kap felületet a törésponthoz.
Az EnumerateBreakpoints metódus egy olyan enumerátort ad vissza, amely képes az adott szkriptben beállított töréspontok számbavételére.
A GetEventFilter metódus azt adja vissza, hogy engedélyezve van-e az "esemény megszakítása" egy adott eseménynél. Az eseményeket, amelyek "eseménytörést" okozhatnak, a ScriptDebugEventFilter enumerálás egyik tagja írja le.
A SetEventFilter metódus módosítja a ScriptDebugEventFilter enumerálás egy tagja által meghatározott esemény "eseménytörési" viselkedését. Az elérhető események teljes listája (és a számbavétel leírása) megtalálható a GetEventFilter metódus dokumentációjában.
A StartDebugging metódus "bekapcsolja" egy adott szkript hibakeresőjének használatát. A hibakeresés indítása nem okoz aktívan végrehajtási törést vagy léptetést. Ez csupán a szkript hibakeresését teszi lehetővé, és interfészek készletét biztosítja az ügyfél számára a hibakeresési felülettel való kommunikációhoz.
A StopDebugging metódust egy olyan ügyfél hívja meg, amely le szeretné állítani a hibakeresést. Ez a metódushívás a StartDebugging sikeres végrehajtása után bármikor kezdeményezhető (például szünet közben, a szkript végrehajtása közben stb.). A hívás azonnal megszünteti az összes hibakeresési tevékenységet, és visszaállítja az állapotot a StartDebugging hívása előtt.
Hibakereső felület: IDataModelScriptDebugClient
A hibakereső gazdagépnek vagy hibakereső alkalmazásnak, amely interfészt kíván biztosítani a szkript hibakereséséhez, biztosítania kell az IDataModelScriptDebugClient felület implementálását a szkript hibakeresőjének a szkript hibakeresési felületén található StartDebugging metóduson keresztül.
Az IDataModelScriptDebugClient az a kommunikációs csatorna, amelyen keresztül a hibakeresési események áthaladnak, és a vezérlés a szkriptvégrehajtási motorról egy hibakereső felületre kerül. Ez a következőképpen van definiálva.
DECLARE_INTERFACE_(IDataModelScriptDebugClient, IUnknown)
{
STDMETHOD(NotifyDebugEvent)(_In_ ScriptDebugEventInformation *pEventInfo, _In_ IDataModelScript *pScript, _In_opt_ IModelObject *pEventDataObject, _Inout_ ScriptExecutionKind *resumeEventKind) PURE;
}
Amikor bármilyen esemény bekövetkezik, amely a szkript hibakeresője felé tör, maga a hibakeresési kód a NotifyDebugEvent metóduson keresztül hívja meg a felületet. Ez a módszer szinkron. A szkript végrehajtása nem folytatódik, amíg a felület vissza nem tér az eseményből. A szkript hibakeresőjének definíciója egyszerű: egyáltalán nincs feldolgozást igénylő beágyazott esemény. A hibakeresési eseményt egy ScriptDebugEventInformation nevű változatrekord határozza meg. Az eseményinformációk mely mezői érvényesek, nagyrészt a DebugEvent tag határozza meg. Meghatározza a ScriptDebugEvent enumerálás egyik tagja által leírt eseménytípust.
Hívásverem: IDataModelScriptDebugStack
Amikor olyan esemény következik be, amely a szkript hibakeresője felé tör, a hibakereső felület le szeretné kérni a töréshely hívásveremét. Ez a GetStack metóduson keresztül történik. Az ilyen verem az alábbi módon definiált IDataModelScriptDebugStack használatával van kifejezve.
Vegye figyelembe, hogy a teljes verem több szkriptre és/vagy több szkriptszolgáltatóra is kiterjedhet. Az adott szkript hibakeresési felületén egy hívásból a GetStack metódusnak visszaadott hívásveremnek csak a hívásverem adott szkript határán belüli szegmensét kell visszaadnia. Teljes mértékben lehetséges, hogy a szkript hibakeresési motorja le tudja kérni a hívásverem több szkriptkörnyezetre kiterjedő lekérését, ha ugyanazon szolgáltató két szkriptje működik együtt. A GetStack metódus nem adja vissza a verem egy másik szkriptben lévő részét. Ehelyett, ha ez a helyzet észlelhető, a szkript határkeretét képező veremkeretnek áttűnési keretként kell megjelölnie magát az IsTransitionPoint és a GetTransition metódus implementációján keresztül az adott veremkereten. A hibakereső felület várhatóan összefűzi a teljes vermet a meglévő több veremszegmensből.
Elengedhetetlen, hogy az áttűnések ilyen módon legyenek implementálva, vagy a hibakeresési felület a helyi változókkal, paraméterekkel, töréspontokkal és más szkriptspecifikus szerkezetekkel kapcsolatos kérdéseket rossz szkriptkörnyezetbe irányíthatja! Ez nem definiált viselkedést eredményez a hibakereső felületén.
DECLARE_INTERFACE_(IDataModelScriptDebugStack, IUnknown)
{
STDMETHOD_(ULONG64, GetFrameCount)() PURE;
STDMETHOD(GetStackFrame)(_In_ ULONG64 frameNumber, _COM_Outptr_ IDataModelScriptDebugStackFrame **stackFrame) PURE;
}
A GetFrameCount metódus a hívásverem ezen szegmensében lévő veremkeretek számát adja vissza. Ha a szolgáltató különböző szkriptkörnyezetekben vagy különböző szolgáltatókban képes kereteket észlelni, ezt a hívónak az IsTransitionPoint és a GetTransition metódus implementálásával kell jeleznie a hívónak a beviteli keretben ebbe a veremszegmensbe.
A GetStackFrame egy adott veremkeretet kap a veremszegmensből. A hívásverem nulla alapú indexelési rendszerrel rendelkezik: az aktuális veremkeret, ahol a törésesemény történt, a 0. keret. Az aktuális metódus hívója az 1. keret (és így tovább).
Állapot vizsgálata hibás állapot esetén: IDataModelScriptDebugStackFrame
A hívásverem egy adott kerete, amikor a szkript hibakeresőjébe törnek, lekérhető a GetStackFrame metódus meghívásával az IDataModelScriptDebugStack interfészen, amely a törést okozó veremszegmenst jelöli. A keret megjelenítéséhez visszaadott IDataModelScriptDebugStackFrame interfész a következőképpen van definiálva.
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;
}
A GetName metódus a keret megjelenítendő nevét (például: függvény nevét) adja vissza. Az ilyen név megjelenik a hibakereső felületén a felhasználónak megjelenített verem-visszakövetésen belül.
A GetPosition metódus a veremkeret által képviselt szkripten belüli pozíciót adja vissza. Ez a metódus csak akkor hívható meg, ha a szkript egy törésen belül van, amelyet az a verem jelöl, amelyben ez a keret található. A kereten belüli vonal- és oszlophelyzet mindig vissza lesz adva. Ha a hibakereső képes visszaadni a szkripten belüli "végrehajtási pozíció" időtartamát, a positionSpanEnd argumentumban egy záró pozíció adható vissza. Ha a hibakereső nem képes erre, a sor- és oszlopértékeket (ha szükséges) nullára kell állítani.
Az IDataModelScriptDebugStack felület egy hívásverem egy szegmensét jelöli – a hívásverem azon részét, amely egy szkript kontextusában található. Ha a hibakereső képes észlelni az egyik szkriptről a másikra (vagy egy szkriptszolgáltatóról a másikra) való áttérést, ezt az IsTransitionPoint metódus implementálásával jelezheti, és szükség szerint igaz vagy hamis értéket ad vissza. Áttűnéspontnak kell tekinteni azt a hívásveremkeretet, amely beírta azt a szkriptet, amelyre a szegmens vonatkozik. Az összes többi képkocka nem.
Ha egy adott veremkeret egy áttűnési pont, amelyet az IsTransition metódus határoz meg (az áttűnési pontok definícióját a dokumentációban találja), a GetTransition metódus az áttűnésről ad vissza információkat. Ez a metódus különösen az előző szkriptet adja vissza – azt, amely hívást kezdeményezett az IDataModelScriptDebugStackFrame-et tartalmazó veremszegmens által képviselt szkriptbe.
Az Evaluate metódus kiértékel egy kifejezést (a szkriptszolgáltató nyelvét) annak a veremkeretnek a kontextusában, amelyet az IDataModelScriptDebugStackFrame felület képvisel, amelyen a metódust meghívták. A kifejezés kiértékelésének eredményét IModelObject-ként kell kivenni a szkriptszolgáltatóból. Az eredményül kapott IModelObject tulajdonságainak és egyéb szerkezeteinek mind be kell szerezniük, amíg a hibakereső törésállapotban van.
Az EnumerateLocals metódus egy (IDataModelScriptDebugVariableSetEnumerator interfész által képviselt) változókészletet ad vissza az összes olyan helyi változóhoz, amely hatókörben van a veremkeret kontextusában, amelyet az IDataModelScriptDebugStackFrame interfész képvisel, amelyen a metódust meghívták.
Az EnumerateArguments metódus egy változókészletet ad vissza (amelyet egy IDataModelScriptDebugVariableSetEnumerator interfész képvisel) a függvény összes függvényargumentumához, amelyet az IDataModelScriptDebugStackFrame felület képvisel, amelyen ezt a metódust meghívták.
Változók keresése: IDataModelScriptDebugVariableSetEnumerator
A hibakeresés alatt álló szkript változóinak halmazát (függetlenül attól, hogy egy adott hatókörben lévők, egy függvény helyi értékei, egy függvény argumentumai stb.) egy, az IDataModelScriptDebugVariableSetEnumerator felületen definiált változókészlettel jelölik:
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;
}
Az Alaphelyzetbe állítás módszer a számba vevő helyét a létrehozás után azonnal visszaállítja, vagyis a készlet első eleme előtt.
A GetNext metódus áthelyezi az enumerátort a halmaz következő változójára, és visszaadja a változó nevét, értékét és a hozzá társított metaadatokat. Ha az enumerátor elérte a készlet végét, a E_BOUNDS hiba jelenik meg. Miután a E_BOUNDS jelölőt visszaadta a GetNext metódusból, a rendszer továbbra is E_BOUNDS fog létrehozni, amikor újra meghívják, kivéve, ha egy beavatkozó visszaállítási hívás történik.
töréspontok: IDataModelScriptDebugBreakpoint
A szkripttörési pontok a SetBreakpoint metódussal vannak beállítva egy adott szkript hibakeresési felületén. Az ilyen töréspontokat egy egyedi azonosító és az IDataModelScriptDebugBreakpoint felület implementációja képviseli, amely az alábbiak szerint van definiálva.
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;
}
A GetId metódus a szkriptszolgáltató hibakeresési motorja által a törésponthoz rendelt egyedi azonosítót adja vissza. Ennek az azonosítónak egyedinek kell lennie a tartalmazó szkript kontextusában. A töréspont azonosítója egyedi lehet a szolgáltató számára; ez azonban nem kötelező.
Az IsEnabled metódus azt adja vissza, hogy engedélyezve van-e a töréspont. Egy letiltott töréspont továbbra is létezik, és továbbra is szerepel a szkript töréspontjainak listáján, csupán ideiglenesen "ki van kapcsolva". Minden töréspontot engedélyezett állapotban kell létrehozni.
Az Engedélyezés metódus engedélyezi a töréspontot. Ha a töréspont le lett tiltva, a metódus meghívása után "a töréspontra érve" hibatörést okoz a hibakeresőben.
A Letiltás metódus letiltja a töréspontot. A hívás után a metódus meghívása után "a töréspontot érve" nem törik be a hibakeresőbe. A töréspont, amíg még jelen van, "ki van kapcsolva".
Az Eltávolítás metódus eltávolítja a töréspontot a tartalmazó listából. A töréspont már nem létezik szemantikailag a metódus visszatérése után. A töréspontot ábrázoló IDataModelScriptDebugBreakpoint felület a hívás után árvanak minősül. A hívás után (jogilag) semmi más nem végezhető el vele, csak a kiadásával.
A GetPosition metódus visszaadja a töréspont helyét a szkripten belül. A szkript hibakeresőjének vissza kell adnia a töréspont forráskódon belüli sorát és oszlopát. Ha képes erre, a töréspont által képviselt forrástartományt is visszaadhatja a positionSpanEnd argumentum által meghatározott végpozíció kitöltésével. Ha a hibakereső nem tudja ezt a tartományt generálni, és a hívó kéri, a span záró pozíciójának Sor és Oszlop mezőit nullával kell kitölteni, ami azt jelzi, hogy az értékek nem adhatók meg.
Töréspont számbavétele: IDataModelScriptDebugBreakpointEnumerator
Ha egy szkriptszolgáltató támogatja a hibakeresést, nyomon kell követnie az egyes és minden szkripthez társított töréspontokat is, és képesnek kell lennie a töréspontok számbavételére a hibakeresési felületre. A töréspontok enumerátora az EnumerateBreakpoints metódussal szerezhető be egy adott szkript hibakeresési felületén, és az alábbiak szerint van definiálva.
DECLARE_INTERFACE_(IDataModelScriptDebugBreakpointEnumerator, IUnknown)
{
STDMETHOD(Reset)() PURE;
STDMETHOD(GetNext)(_COM_Outptr_ IDataModelScriptDebugBreakpoint **breakpoint) PURE;
}
Az Alaphelyzetbe állítási módszer visszaállítja az enumerátor pozícióját arra a helyre, ahol az enumerátor létrehozása után volt , vagyis az első számba vett töréspont előtt.
A GetNext metódus áthelyezi az enumerátort a következő töréspontra a számbavételhez, és visszaadja az adott töréspont IDataModelScriptDebugBreakpoint felületét. Ha az enumerátor elérte az enumerálás végét, E_BOUNDS ad vissza. A E_BOUNDS hiba létrejötte után a GetNext metódus későbbi hívásai továbbra is E_BOUNDS fognak létrejönni, kivéve, ha az Alaphelyzetbe állítási metódusra irányuló beavatkozó hívás történt.
Lásd még:
Ez a témakör egy olyan sorozat része, amely leírja a C++-ból elérhető felületeket, a C++ alapú hibakeresőbővítmények készítésének módját, valamint azt, hogy miként használhat más adatmodell-szerkezeteket (pl. JavaScript vagy NatVis) egy C++ adatmodell-bővítményből.
Hibakereső adatmodell C++ áttekintése
Hibakereső adatmodell C++ interfészei
Hibakereső adatmodell C++ objektumai