Debuggerdatenmodell C++-Zusätzliche Schnittstellen

In diesem Thema werden einige zusätzliche Schnittstellen beschrieben, die dem Debugger C++-Datenmodell zugeordnet sind, z. B. Metadaten, Konzepte und Objektaufzählung.

Debuggerdatenmodellmetadatenschnittstellen

Einer der Kernbegriffe im Datenmodell ist, dass ein Objekt (insbesondere ein synthetisches Objekt) ein Wörterbuch mit Schlüssel-,Wert-/Metadatentupeln ist. Jedem Schlüssel kann ein ganzer Speicher von Metadaten zugeordnet sein, der eine Vielzahl von Dingen beschreibt, die den Schlüssel und seinen potenziellen Wert umgeben. Beachten Sie, dass die Metadaten den Wert des Schlüssels in keiner Weise ändern. Es sind nur 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 seines Werts auswirken können.

In gewisser Hinsicht unterscheidet sich ein Metadatenspeicher nicht allzu sehr von den Schlüssel-,Wert-/Metadatentupeln, die das Wesen eines Objekts im Datenmodell sind. Es wird jedoch von dieser Ansicht aus vereinfacht. Ein Metadatenspeicher wird durch die IKeyStore-Schnittstelle dargestellt. Es gibt zwar auch eine Sammlung von Schlüssel-Wert-/Metadatentupeln, aber es gibt Einschränkungen, was mit einem Metadatenschlüsselspeicher im Vergleich zu einem Modellobjekt gemacht werden kann:

  • Ein Schlüsselspeicher kann nur über einen einzelnen übergeordneten Speicher verfügen. Er kann keine beliebige Kette übergeordneter Modelle aufweisen.
  • Ein Schlüsselspeicher verfügt über keine Konzepte. Es kann nur das Wörterbuch der Schlüssel-/Wert-/Metadatentupel 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.
  • Nur konventionshalber sind die Werte in einem metadatendefiniertem Schlüsselspeicher auf Basiswerte (systeminterne Und Eigenschaftszugriffe) beschränkt.

Während ein Schlüsselspeicher eine beliebige Zahl (und eine beliebige Benennung) von Schlüsseln haben 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 Ordnungswert angezeigt werden soll.
PreferredFormat Ganzzahl: wie durch die PreferredFormat-Enumeration definiert Gibt den bevorzugten Formatierungstyp für die Anzeige des Werts an.
PreferredLength Integer Gibt für Arrays und andere Container an, wie viele Elemente standardmäßig angezeigt werden sollen.
FindDerivation Boolean Gibt an, ob der Debughost eine abgeleitete Typanalyse für den Wert vor der Verwendung durchführen soll (z. B. anzeigen).
Hilfe String Hilfetext im Tooltippformat für den Schlüssel, der von der Benutzeroberfläche auf entsprechend hilfreiche Weise dargestellt werden kann.
ActionName String Gibt an, dass die angegebene Methode (die keine Argumente akzeptiert 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 Schnittstelle darzustellen.
ActionIsDefault Boolean Nur gültig, wenn der ActionName-Schlüssel angegeben ist, gibt an, dass dies die Standardaktion für das Objekt ist.
ActionDescription String Nur gültig, wenn der ActionName-Schlüssel angegeben ist, gibt dies eine Beschreibung im Tooltip-Format für die Aktion. Ein solcher Text kann von der Benutzeroberfläche entsprechend hilfreich dargestellt werden.

Beachten Sie, dass Schlüssel im Metadatenspeicher zwar über eigene Metadaten (ad infiniteum) verfügen können, aber derzeit keine Verwendung dafür gibt. Die meisten Aufrufer geben null für alle Metadatenparameter in Methoden auf der IKeyStore-Schnittstelle an.

Die Zentrale Metadatenschnittstelle: 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;
}

GetKey

Die GetKey-Methode entspricht der GetKey-Methode auf 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 Eigenschaftenzugriffsor aufgerufen wird, wenn der Wert des Schlüssels ein Eigenschaftszugriffsor ist. Der tatsächliche IModelPropertyAccessor, der in einem IModelObject-Objekt enthalten ist, wird zurückgegeben. Es ist typisch, dass ein Client Aus diesem Grund GetKeyValue aufruft.

Setkey

Die SetKey-Methode entspricht der SetKey-Methode auf IModelObject. Dies ist die einzige Methode, die einen Schlüssel erstellen und ihm Metadaten im Schlüsselspeicher zuordnen kann.

GetKeyValue

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 des übergeordneten Speichers) vorhanden ist, werden der Wert dieses Schlüssels und alle diesem zugeordneten Metadaten zurückgegeben. Wenn der Wert des Schlüssels ein Eigenschaftszugriffsor ist (ein IModelPropertyAccessor, der in ein IModelObject eingeschlossen ist), wird die GetValue-Methode des Eigenschaftszugriffs von GetKeyValue automatisch aufgerufen und der zugrunde liegende Wert der zurückgegebenen Eigenschaft.

SetKeyValue

Die SetKeyValue-Methode ist analog zur SetKeyValue-Methode für IModelObject. Diese Methode ist nicht in der Lage, einen neuen Schlüssel im Metadatenspeicher zu erstellen. Wenn ein Schlüssel vorhanden ist, wie durch das Schlüsselargument angegeben, wird sein Wert wie angegeben festgelegt. Wenn es sich bei dem Schlüssel um einen Eigenschaftenzugriffsor handelt, wird die SetValue-Methode auf dem Eigenschaftszugriffsor aufgerufen, um den zugrunde liegenden Wert festzulegen. Beachten Sie, dass Metadaten nach der Erstellung in der Regel statisch sind. Die Verwendung dieser Methode in einem Metadatenschlüsselspeicher sollte selten sein.

ClearKeys

Die ClearKeys-Methode ist analog zur ClearKeys-Methode auf IModelObject. Es entfernt jeden Schlüssel aus dem angegebenen Metadatenspeicher. Diese Methode hat keine Auswirkungen auf einen übergeordneten Speicher.

Objektaufzählung im Datenmodell

Auflisten von Objekten im Datenmodell

Im Datenmodell gibt es zwei zentrale Schnittstellen für Schlüsselaufzählungen: IKeyEnumerator und IRawEnumerator. Dies sind zwar die beiden Kernschnittstellen, aber sie können verwendet werden, um Objekte in einem von drei Formaten aufzulisten:

Schlüssel : Die IKeyEnumerator-Schnittstelle kann über einen Aufruf von EnumerateKeys abgerufen werden, um die Schlüssel eines Objekts und deren Werte/Metadaten aufzulisten, ohne die zugrunde liegenden Eigenschaftszugriffsoren aufzulösen. Dieser Enumerationsstil kann unformatierte IModelPropertyAccessor-Werte zurückgeben, die in IModelObjects enthalten sind.

Werte : Die IKeyEnumerator- und IRawEnumerator-Schnittstellen können über Aufrufe von EnumerateKeyValues oder EnumerateRawValues abgerufen werden, um die Schlüssel/Rohwerte eines Objekts und deren Werte/Metadaten aufzulisten. Alle in der Enumeration vorhandenen Eigenschaftsaccessoren werden während einer solchen Enumeration automatisch über einen Aufruf der zugrunde liegenden GetValue-Methode aufgelöst.

Verweise : Die IKeyEnumerator- und IRawEnumerator-Schnittstellen können über Aufrufe von EnumerateKeyReferences oder EnumerateRawReferences abgerufen werden, um Verweise auf die Schlüssel/Rohdatenwerte eines Objekts aufzulisten. Solche Verweise können gespeichert und später verwendet werden, um den zugrunde liegenden Schlüssel oder Rohwert abzurufen oder festzulegen.

KeyEnumerator: Enumeration synthetischer Schlüssel

Die IKeyEnumerator-Schnittstelle ist die einzelne Schnittstelle für die Enumeration aller Schlüssel (nach Schlüssel, Wert oder Verweis) innerhalb eines instance -Objekts und aller zugeordneten übergeordneten Modelle in der übergeordneten Modellkette. Die Schnittstelle wird 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;
}

Zurücksetzen

Die Reset-Methode setzt den Enumerator auf die Position zurück, an der er sich beim ersten Erwerb befand (z. B. vor dem ersten Element in der Enumeration). Bei einem nachfolgenden Aufruf von GetNext wird der erste aufgezählte Schlüssel zurückgegeben.

GetNext

Die GetNext-Methode verschiebt den Enumerator nach vorne und gibt den Schlüssel an dieser Position in der Enumeration zurück.

IRawEnumerator: Enumeration von nativen oder zugrunde liegenden Sprachkonstrukten (C/C++)

Die IRawEnumerator-Schnittstelle ist die einzelne Schnittstelle für die Enumeration aller nativen/sprachbasierten Konstrukte (nach Wert oder Verweis) innerhalb eines Objekts, das ein natives Konstrukt im Adressraum des Debugziels darstellt. Die Schnittstelle wird 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;
}

Zurücksetzen

Die Reset-Methode setzt den Enumerator an die Position zurück, an der er sich befand, als er zum ersten Mal abgerufen wurde (z. B. vor dem ersten Element in der Enumeration). Bei einem nachfolgenden Aufruf von GetNext wird das erste enumerierte native/sprachliche Konstrukt zurückgegeben.

GetNext

Die GetNext-Methode verschiebt den Enumerator nach vorne und gibt das native/sprachbasierte Konstrukt an dieser Position in der Enumeration zurück.


Siehe auch

Dieses Thema ist Teil einer Reihe, die die Schnittstellen beschreibt, auf die über C++ zugegriffen werden kann, wie sie zum Erstellen einer C++-basierten Debuggererweiterung verwendet werden und wie Sie andere Datenmodellkonstrukte (z. B. JavaScript oder NatVis) aus einer C++-Datenmodellerweiterung verwenden.

Übersicht über das Debuggerdatenmodell in C++

Debuggerdatenmodell-C++-Schnittstellen

Debuggerdatenmodell-C++-Objekte

Debuggerdatenmodell C++-Zusätzliche Schnittstellen

Debuggerdatenmodell C++-Konzepte

Debuggerdatenmodell C++-Skripterstellung