Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Thema werden einige zusätzliche Schnittstellen beschrieben, die dem Debugger-C++-Datenmodell zugeordnet sind, z. B. Metadaten, Konzepte und Objektenumeration.
Debugger-Datenmodell-Metadatenschnittstellen
Einer der Kernbegriffe im Datenmodell besteht darin, dass ein Objekt (insbesondere ein synthetisches Objekt) ein Wörterbuch mit Schlüssel-/Wert-/Metadaten-Tupeln ist. Jeder Schlüssel kann über einen gesamten Metadatenspeicher verfügen, der eine Vielzahl von Elementen beschreibt, die den Schlüssel und seinen potenziellen Wert umgeben. Beachten Sie, dass die Metadaten in keiner Weise den Wert des Schlüssels ändern. Es handelt sich nur um zusätzliche Informationen, die dem Schlüssel und seinem Wert zugeordnet sind, die sich auf die Präsentation oder andere zugeordnete Attribute des Schlüssels und dessen Wert auswirken können.
In einigen Fällen unterscheidet sich ein Metadatenspeicher nicht alles von den Schlüssel-/Wert-/Metadaten-Tupeln, die das Wesen eines Objekts im Datenmodell sind. Es ist jedoch aus dieser Ansicht vereinfacht. Ein Metadatenspeicher wird durch die IKeyStore-Schnittstelle dargestellt. Es gibt zwar auch eine Sammlung von Schlüssel-/Wert-/Metadaten-Tupeln, aber es gibt Einschränkungen, was mit einem Metadatenschlüsselspeicher im Vergleich zu einem Modellobjekt geschehen kann:
- Ein Schlüsselspeicher kann nur über einen einzigen übergeordneten Speicher verfügen – es kann keine beliebige Kette von übergeordneten Modellen haben.
- Ein Schlüsselspeicher hat keine Konzepte. Es kann nur das Wörterbuch mit Schlüssel-/Wert-/Metadaten-Tupeln enthalten. Dies bedeutet, dass die in einem Schlüsselspeicher vorhandenen Schlüssel statisch sind. Sie können nicht bei Bedarf von einem dynamischen Sprachsystem erstellt werden.
- Standardmäßig sind die Werte in einem metadatendefinierten Schlüsselspeicher nur auf grundlegende Werte (systeminterne und Eigenschaftsaccessoren) beschränkt.
Während ein Schlüsselspeicher eine beliebige Zahl (und beliebige Benennung) von Schlüsseln aufweisen kann, gibt es bestimmte Namen, die semantische Werte definiert haben. Derzeit sind diese Namen:
Schlüsselname | Werttyp | BESCHREIBUNG |
---|---|---|
PreferredRadix | Ganze Zahl: 2, 8, 10 oder 16 | Gibt an, in welchem Radix ein Ordinalwert angezeigt werden soll |
PreferredFormat | Ganze Zahl: wie durch die PreferredFormat-Aufzählung definiert | Gibt den bevorzugten Formatierungstyp für die Anzeige des Werts an. |
PreferredLength | Ganze Zahl | Gibt für Arrays und andere Container an, wie viele Elemente standardmäßig angezeigt werden sollen. |
FindDerivation | Boolean | Gibt an, ob der Debughost abgeleitete Typanalyse für den Wert vor der Verwendung ausführen soll (z. B. Anzeigen) |
Hilfe | Schnur | QuickInfo-Hilfetext für den Schlüssel, der von der Benutzeroberfläche entsprechend hilfreich dargestellt werden kann. |
ActionName | Schnur | Gibt an, dass die angegebene Methode (eine, die keine Argumente verwendet und keine Werte zurückgibt) eine Aktion ist. Der Name der Aktion wird in Metadaten angegeben. Eine Benutzeroberfläche kann diesen Namen verwenden, um die Option in einem Kontextmenü oder einer anderen geeigneten Benutzeroberfläche darzustellen. |
ActionIsDefault | Boolean | Nur gültig, wenn der Aktionsname-Schlüssel angegeben ist, gibt an, dass dies die Standardaktion für das Objekt ist. |
Aktionsbeschreibung | Schnur | Nur gültig, wenn der Aktionsname-Schlüssel angegeben ist, gibt dies eine QuickInfo-Formatbeschreibung für die Aktion. Ein solcher Text kann von der Benutzeroberfläche entsprechend hilfreich dargestellt werden. |
Beachten Sie, dass schlüssel im Metadatenspeicher ihre eigenen Metadaten (ad infiniteum) haben können, es derzeit keine Verwendung für solche gibt. Die meisten Aufrufer geben null für alle Metadatenparameter in Methoden auf der IKeyStore-Schnittstelle an.
die Kernmetadatenschnittstelle: IKeyStore-
Die IKeyStore-Schnittstelle ist wie folgt definiert:
DECLARE_INTERFACE_(IKeyStore, IUnknown)
{
STDMETHOD(GetKey)(_In_ PCWSTR key, _COM_Errorptr_opt_ IModelObject** object, _COM_Outptr_opt_result_maybenull_ IKeyStore** metadata) PURE;
STDMETHOD(SetKey)(_In_ PCWSTR key, _In_opt_ IModelObject* object, _In_opt_ IKeyStore* metadata) PURE;
STDMETHOD(GetKeyValue)(_In_ PCWSTR key, _COM_Errorptr_opt_ IModelObject** object, _COM_Outptr_opt_result_maybenull_ IKeyStore** metadata) PURE;
STDMETHOD(SetKeyValue)(_In_ PCWSTR key, _In_ IModelObject* object) PURE;
STDMETHOD(ClearKeys)() PURE;
}
Die GetKey-Methode entspricht der GetKey-Methode für IModelObject. Er gibt den Wert des angegebenen Schlüssels zurück, wenn er im Schlüsselspeicher oder im übergeordneten Speicher des Schlüsselspeichers vorhanden ist. Beachten Sie, dass die GetValue-Methode nicht für den Eigenschaftenaccessor aufgerufen wird, wenn der Wert des Schlüssels ein Eigenschaftsaccessor ist. Das tatsächliche IModelPropertyAccessor-Feld in ein IModelObject wird zurückgegeben. Es ist typisch, dass ein Client GetKeyValue aus diesem Grund aufruft.
Die SetKey-Methode entspricht der SetKey-Methode für IModelObject. Es ist die einzige Methode, die einen Schlüssel erstellen und Metadaten innerhalb des Schlüsselspeichers zuordnen kann.
Die GetKeyValue-Methode ist die erste Methode, zu der ein Client wechselt, um den Wert eines bestimmten Schlüssels im Metadatenspeicher zu finden. Wenn der durch das Schlüsselargument angegebene Schlüssel innerhalb des Speichers (oder im übergeordneten Speicher) vorhanden ist, wird der Wert dieses Schlüssels und alle damit verbundenen Metadaten zurückgegeben. Wenn der Wert des Schlüssels ein Eigenschaftsaccessor (ein IModelPropertyAccessor-Feld in ein IModelObject) ist, wird die GetValue-Methode des Eigenschaftenaccessors automatisch von GetKeyValue und dem zugrunde liegenden Wert der zurückgegebenen Eigenschaft aufgerufen.
Die SetKeyValue-Methode entspricht der SetKeyValue-Methode für IModelObject. Diese Methode ist nicht in der Lage, einen neuen Schlüssel im Metadatenspeicher zu erstellen. Wenn ein vorhandener Schlüssel vorhanden ist, wie durch das Schlüsselargument angegeben, wird der Wert wie angegeben festgelegt. Wenn der Schlüssel ein Eigenschaftsaccessor ist, wird die SetValue-Methode für den Eigenschaftenaccessor aufgerufen, um den zugrunde liegenden Wert festzulegen. Beachten Sie, dass Metadaten in der Regel statisch sind, sobald sie erstellt wurden. Die Verwendung dieser Methode für einen Metadatenschlüsselspeicher sollte selten sein.
Die ClearKeys-Methode entspricht der ClearKeys-Methode für IModelObject. Er entfernt jeden Schlüssel aus dem angegebenen Metadatenspeicher. Diese Methode hat keine Auswirkungen auf einen übergeordneten Speicher.
-Objektaufzählung im Datenmodell
Aufzählen von Objekten im Datenmodell-
Im Datenmodell gibt es zwei Kernschlüsselaufzählungsschnittstellen: IKeyEnumerator und IRawEnumerator. Dies sind zwar die beiden Kernschnittstellen, sie können jedoch zum Aufzählen von Objekten in einer von drei Formatvorlagen verwendet werden:
Keys – Die IKeyEnumerator-Schnittstelle kann über einen Aufruf von EnumerateKeys abgerufen werden, um die Schlüssel eines Objekts und deren Werte/Metadaten aufzulisten, ohne zugrunde liegende Eigenschaftenaccessoren aufzulösen. Diese Aufzählungsart kann unformatierte IModelPropertyAccessor-Werte zurückgeben, die in IModelObjects enthalten sind.
Values - Die IKeyEnumerator- und IRawEnumerator-Schnittstellen können über Aufrufe von EnumerateKeyValues oder EnumerateRawValues abgerufen werden, um die Schlüssel/Rohwerte für ein Objekt und deren Werte/Metadaten auflisten zu können. Alle eigenschaftenaccessoren, die in der Enumeration vorhanden sind, werden automatisch über einen Aufruf der zugrunde liegenden GetValue-Methode während einer solchen Enumeration aufgelöst.
Verweise - Die IKeyEnumerator- und IRawEnumerator-Schnittstellen können über Aufrufe von EnumerateKeyReferences oder EnumerateRawReferences abgerufen werden, um Verweise auf die Schlüssel/Rohwerte für ein Objekt aufzählen zu können. Solche Verweise können gespeichert und später verwendet werden, um den zugrunde liegenden Schlüssel oder rohen Wert abzurufen oder festzulegen.
KeyEnumerator: Aufzählung synthetischer Schlüssel
Die IKeyEnumerator-Schnittstelle ist die einzige Schnittstelle für die Enumeration aller Schlüssel (nach Schlüssel, Wert oder Verweis) innerhalb eines Instanzobjekts und aller zugeordneten übergeordneten Modelle in der übergeordneten Modellkette. Die Schnittstelle ist wie folgt definiert:
DECLARE_INTERFACE_(IKeyEnumerator, IUnknown)
{
STDMETHOD(Reset)() PURE;
STDMETHOD(GetNext)(_Out_ BSTR* key, _COM_Errorptr_opt_ IModelObject** value, _COM_Outptr_opt_result_maybenull_ IKeyStore** metadata) PURE;
}
Die Reset-Methode setzt den Enumerator auf die Position zurück, an der sie sich befand, als sie zum ersten Mal erworben wurde (z. B. vor dem ersten Element in der Enumeration). Bei einem nachfolgenden Aufruf von GetNext wird der erste aufgezählte Schlüssel zurückgegeben.
Die GetNext-Methode verschiebt den Enumerator vorwärts und gibt den Schlüssel an dieser Position in der Enumeration zurück.
IRawEnumerator: Aufzählung der systemeigenen oder zugrunde liegenden Sprache (C/C++) erstellt
Die IRawEnumerator-Schnittstelle ist die einzige Schnittstelle für die Enumeration aller systemeigenen/spracheigenen Konstrukte (nach Wert oder Verweis) innerhalb eines Objekts, das ein systemeigenes Konstrukt innerhalb des Adressraums des Debugziels darstellt. Die Schnittstelle ist wie folgt definiert:
DECLARE_INTERFACE_(IRawEnumerator, IUnknown)
{
STDMETHOD(Reset)() PURE;
STDMETHOD(GetNext)(_Out_opt_ BSTR* name, _Out_opt_ SymbolKind *kind, _COM_Errorptr_opt_ IModelObject** value) PURE;
}
Die Reset-Methode setzt den Enumerator auf die Position zurück, an der sie sich befand, als sie zum ersten Mal erworben wurde (z. B. vor dem ersten Element in der Enumeration). Ein nachfolgender Aufruf von GetNext gibt das erste aufgezählte System-/Sprachkonstrukt zurück.
Die GetNext-Methode verschiebt den Enumerator vorwärts und gibt das systemeigene/spracheigene Konstrukt an dieser Position in der Enumeration zurück.
Siehe auch
Dieses Thema ist Teil einer Reihe, in der die von C++ zugänglichen Schnittstellen beschrieben werden, wie sie zum Erstellen einer C++-basierten Debuggererweiterung und zur Verwendung anderer Datenmodellkonstrukte (z. B. JavaScript oder NatVis) aus einer C++-Datenmodellerweiterung verwendet werden.
Debuggerdatenmodell C++-Übersicht
Debuggerdatenmodell-C++-Schnittstellen
Debugger-Datenmodell-C++-Objekte