Поделиться через


Дополнительные интерфейсы модели данных отладчика C++

В этом разделе описываются некоторые дополнительные интерфейсы, связанные с моделью данных отладчика C++, например метаданными, понятиями и перечислением объектов.

Интерфейсы метаданных модели данных отладчика

Одним из основных понятий в модели данных является то, что объект (особенно искусственный) является словарем кортежей ключей, значений или метаданных. Каждый ключ может иметь целое хранилище метаданных, связанных с ним, которое описывает различные вещи, окружающие ключ и его потенциальное значение. Обратите внимание, что метаданные не изменяют значение ключа. Это только вспомогательные сведения, связанные с ключом и его значением, которые могут повлиять на презентацию или другие связанные атрибуты ключа и его значения.

В некоторых смыслах хранилище метаданных не все, что отличается от кортежей ключей, значений или метаданных, которые являются сущностью объекта в модели данных. Однако это упрощено в этом представлении. Хранилище метаданных представлено интерфейсом IKeyStore. В то время как также коллекция кортежей ключей, значений и метаданных, существуют ограничения на то, что можно сделать с хранилищем ключей метаданных и объектом модели:

  • Хранилище ключей может иметь только одно родительское хранилище . Оно не может иметь произвольную цепочку родительских моделей.
  • Хранилище ключей не имеет концепций. Он может иметь только словарь кортежей ключей, значений и метаданных. Это означает, что ключи, присутствующих в хранилище ключей, являются статическими. Они не могут создаваться по запросу динамической языковой системой.
  • Только по соглашению значения в определенном хранилище ключей метаданных ограничены основными значениями (встроенными и средствами доступа к свойствам)

Хотя хранилище ключей может иметь произвольное число (и произвольное именование) ключей, существуют определенные имена, имеющие определенные семантические значения. В настоящее время эти имена:

Имя ключа Тип значения Description
PreferredRadix Целое число: 2, 8, 10 или 16 Указывает, в каком радиксе должно отображаться порядковое значение.
PreferredFormat Целое число: как определено перечислением PreferredFormat Указывает предпочтительный тип форматирования для отображения значения.
PreferredLength Целое Для массивов и других контейнеров указывает, сколько элементов должно отображаться по умолчанию.
FindDerivation Логический Указывает, должен ли узел отладки выполнять анализ производного типа для значения перед использованием (например, отображение)
Справка Строка Текст справки по стилю подсказки инструментов для ключа, который может быть представлен пользовательским интерфейсом соответствующим образом.
ActionName Строка Указывает, что заданный метод (который не принимает аргументы и возвращает значения) является действием. Имя действия указывается в метаданных. Пользовательский интерфейс может использовать это имя для представления параметра в контекстном меню или другом соответствующем интерфейсе.
ActionIsDefault Логический Допустимо только в том случае, если указан ключ ActionName, указывает, что это действие по умолчанию для объекта.
ActionDescription Строка Допустимо только в том случае, если указан ключ ActionName, это дает описание стиля подсказки для действия. Такой текст может быть представлен пользовательским интерфейсом соответствующим образом.

Обратите внимание, что в то время как ключи в хранилище метаданных могут иметь собственные метаданные (ad infiniteum), в настоящее время для этого не используется. Большинство вызывающих объектов указывают значение NULL для всех параметров метаданных в методах интерфейса IKeyStore.

Интерфейс основных метаданных: IKeyStore

Интерфейс IKeyStore определяется следующим образом:

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

Метод GetKey аналогичен методу GetKey в IModelObject. Он вернет значение указанного ключа, если оно существует в хранилище ключей или родительском хранилище ключей. Обратите внимание, что если значение ключа является методом доступа к свойствам, метод GetValue не будет вызываться в методе доступа к свойствам. Фактический объект IModelPropertyAccessor, размещенный в IModelObject, будет возвращен. Обычно клиент вызывает GetKeyValue по этой причине.

SetKey

Метод SetKey аналогичен методу SetKey в IModelObject. Это единственный метод, который способен создавать ключ и связывать метаданные с ним в хранилище ключей.

GetKeyValue

Метод GetKeyValue — это первый метод, к который клиент перейдет, чтобы найти значение определенного ключа в хранилище метаданных. Если ключ, указанный аргументом ключа, существует в хранилище (или родительском хранилище), значение этого ключа и все метаданные, связанные с ним, будут возвращены. Если значение ключа является методом доступа к свойствам (iModelPropertyAccessor, вложенном в IModelObject), метод GetValue метода доступа к свойствам будет автоматически вызываться GetKeyValue и базовое значение возвращаемого свойства.

SetKeyValue

Метод SetKeyValue аналогичен методу SetKeyValue в IModelObject. Этот метод не может создавать новый ключ в хранилище метаданных. Если имеется существующий ключ, указанный аргументом ключа, его значение будет задано как указано. Если ключ является методом доступа к свойствам, метод SetValue будет вызываться для метода доступа к свойствам, чтобы задать базовое значение. Обратите внимание, что метаданные обычно являются статическими после создания. Использование этого метода в хранилище ключей метаданных должно быть редко.

ClearKeys

Метод ClearKeys аналогичен методу ClearKeys в IModelObject. Он удаляет каждый ключ из данного хранилища метаданных. Этот метод не влияет на родительское хранилище.

Перечисление объектов в модели данных

Перечисление объектов в модели данных

В модели данных есть два основных интерфейса перечисления ключей: IKeyEnumerator и IRawEnumerator. Хотя это два основных интерфейса, их можно использовать для перечисления объектов в одном из трех стилей:

Ключи — интерфейс IKeyEnumerator можно получить через вызов ПеречислитьKeys, чтобы перечислить ключи объекта и их значения и метаданные без разрешения каких-либо базовых методов доступа к свойствам. Этот стиль перечисления может возвращать необработанные значения IModelPropertyAccessor, указанные в IModelObjects.

Значения — интерфейсы IKeyEnumerator и IRawEnumerator можно получить с помощью вызовов в ПеречислениеKeyValues или EnumerateRawValues для перечисления ключей или необработанных значений объекта и их значений или метаданных. Все методы доступа к свойствам, присутствующих в перечислении, автоматически разрешаются с помощью вызова базового метода GetValue во время такого перечисления.

Ссылки — интерфейсы IKeyEnumerator и IRawEnumerator можно получить с помощью вызовов в ПеречислениеKeyReferences или EnumerateRawReferences, чтобы перечислить ссылки на ключи или необработанные значения объекта. Такие ссылки можно сохранить и позже использовать для получения или задания базового ключа или необработанного значения.

KeyEnumerator: перечисление синтетических ключей

Интерфейс IKeyEnumerator — это единый интерфейс для перечисления всех ключей (по ключу, значению или ссылке) в объекте экземпляра и всех связанных родительских моделей в своей родительской цепочке моделей. Интерфейс определяется следующим образом:

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;
}

Сбросить

Метод Reset сбрасывает перечислитель в положение, в который он был получен при первом получении (например, до первого элемента перечисления). Последующий вызов GetNext вернет первый перечислимый ключ.

GetNext

Метод GetNext перемещает перечислитель вперед и возвращает ключ в этой позиции в перечислении.

IRawEnumerator: перечисление собственных или базовых конструкций языка (C/C++)

Интерфейс IRawEnumerator — это единый интерфейс для перечисления всех конструкций собственного языка (по значению или ссылке) в объекте, представляющего собственную конструкцию в адресном пространстве целевого объекта отладки. Интерфейс определяется следующим образом:

DECLARE_INTERFACE_(IRawEnumerator, IUnknown)
{
    STDMETHOD(Reset)() PURE;
    STDMETHOD(GetNext)(_Out_opt_ BSTR* name, _Out_opt_ SymbolKind *kind, _COM_Errorptr_opt_ IModelObject** value) PURE;
}

Сбросить

Метод Reset сбрасывает перечислитель в положение, в который он был получен при первом получении (например, до первого элемента перечисления). Последующий вызов GetNext вернет первую перечисленную конструкцию машинного или языкового языка.

GetNext

Метод GetNext перемещает перечислитель вперед и возвращает конструкцию собственного языка в этой позиции в перечислении.


См. также

Этот раздел является частью серии, в которой описываются интерфейсы, доступные на C++, как использовать их для создания расширения отладчика на основе C++ и использования других конструкций модели данных (например, JavaScript или NatVis) из расширения модели данных C++.

Обзор модели данных отладчика C++

Интерфейсы C++ модели данных отладчика

Объекты C++ модели данных отладчика

Дополнительные интерфейсы модели данных отладчика C++

Основные понятия модели данных C++ отладчика

Скрипты модели данных отладчика C++