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


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

В этом разделе описывается использование скриптов отладчика модели данных C++ отладчика C++ для поддержки автоматизации с подсистемой отладчика с помощью скриптов.

управление скриптами в модели данных отладчика

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

Поставщик скриптов — это компонент, который связывает язык (например, NatVis, JavaScript и т.д.) с моделью данных. Он регистрирует одно или несколько расширений файлов (например: ". NatVis", ".js") которые обрабатываются поставщиком, позволяя отладчику или пользовательскому интерфейсу загружать файлы скриптов с этим расширением, делегированием к поставщику.

диспетчер основных скриптов: IDataModelScriptManager

Основной интерфейс диспетчера сценариев определяется следующим образом.

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

Метод GetDefaultNameBinder возвращает привязку имени скрипта по умолчанию модели данных. Привязка имен — это компонент, разрешающий имя в контексте объекта. Например, учитывая выражение "foo.bar", привязка имен вызывается для разрешения строки имен в контексте foo объекта. Привязчик, возвращенный здесь, соответствует набору правил по умолчанию для модели данных. Поставщики скриптов могут использовать этот привязчик для обеспечения согласованности в разрешении имен между поставщиками.

RegisterScriptProvider

Метод RegisterScriptProvider сообщает модели данных о том, что существует новый поставщик скриптов, который способен мостить новый язык к модели данных. При вызове этого метода диспетчер скриптов немедленно вызовет заданный поставщик скриптов и запросит свойства управляемых скриптов. Если у поставщика уже зарегистрировано имя или расширение файла, которое указывает данный поставщик скриптов, этот метод завершится ошибкой. Только один поставщик скриптов можно зарегистрировать в качестве обработчика для определенного имени или расширения файла.

Отмена регистрации ScriptProvider

Метод UnregisterScriptProvider отменяет вызов метода RegisterScriptProvider. Имя и расширение файла, заданное поставщиком неустраченных скриптов, больше не будет связано с ним. Важно отметить, что может быть значительное количество невыполненных com-ссылок на поставщик скриптов даже после отмены регистрации. Этот метод запрещает загрузку и создание скриптов типа, которым управляет данный поставщик скриптов. Если скрипт, загруженный этим поставщиком, по-прежнему загружается или управляет объектной моделью отладчика (или модели данных), эти манипуляции могут по-прежнему иметь ссылки обратно в скрипт. В скрипте могут быть модели данных, методы или объекты, которые напрямую ссылаться на конструкции. Поставщик скриптов должен быть готов к этому.

FindProviderForScriptType

Метод FindProviderForScriptType выполняет поиск диспетчера скриптов для поставщика, имеющего строку типа скрипта, как указано в этом методе. Если не удается найти его, этот метод завершится ошибкой; в противном случае такой поставщик скриптов будет возвращен вызывающей объекту.

ПеречислениеScriptProviders

Метод EnumerateScriptProviders возвращает перечислитель, который перечисляет каждый поставщик скриптов, зарегистрированный в диспетчере скриптов, с помощью предыдущего вызова метода RegisterScriptProvider.

Перечисление поставщика скриптов : IDataModelScriptProviderEnumerator

Метод EnumerateScriptProviders возвращает перечислитель следующей формы:

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

Сбросить

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

GetNext

Метод GetNext перемещает перечислитель вперед один элемент и возвращает поставщик скриптов, который находится в этом элементе. Когда перечислитель попадает в конец перечисления, E_BOUNDS будет возвращен. Вызов метода GetNext после получения этой ошибки будет продолжать возвращать E_BOUNDS неограниченное время.

интерфейсы узлов модели данных C++ для скриптов

роль узла в скриптах

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

Интерфейс Описание
IDebugHostScriptHostHost Интерфейс, указывающий возможность узла отладки принять участие в среде скриптов. Этот интерфейс позволяет создавать контексты, которые информируют обработчики сценариев о расположении объектов.
IDataModelScriptHostContext Интерфейс узла, используемый поставщиком скриптов в качестве контейнера для содержимого скрипта. Как содержимое поверхности скрипта, отличной от манипуляций, которые она выполняет в объектной модели приложения отладчика, выполняется до конкретного узла отладки. Этот интерфейс позволяет поставщику скриптов получать сведения о расположении его содержимого. Дополнительные сведения см. в интерфейсах сценариев C++, далее в этом разделе.

узле скрипта отладки: IDebugHostScriptHost

Интерфейс IDebugHostHostHostHost — это интерфейс, используемый поставщиком скриптов для получения контекста от узла отладки для только что созданного скрипта. Этот контекст включает объект (предоставленный узлом отладки), где поставщик скриптов может размещать любые мосты между моделью данных и средой сценариев. Например, такие мосты могут быть методами модели данных, которые вызывают функции скрипта. Это позволяет вызывающей стороне модели данных вызывать методы скрипта с помощью метода Call в интерфейсе IModelMethod.

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

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

CreateContext

Метод CreateContext вызывается поставщиком скриптов для создания нового контекста, в котором будет размещаться содержимое скрипта. Такой контекст представлен интерфейсом IDataModelScriptHostContext, описанным подробно на странице интерфейсов скриптов модели данных C++.

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

интерфейсы скриптов и скриптов

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

Обратите внимание, что средства отладки для Windows в настоящее время определяют двух поставщиков скриптов.

  • Поставщик NatVis. Этот поставщик внедрен в DbgEng.dll и мосты между NatVis XML и моделями данных, что позволяет визуализации типов данных машинного или языкового языка.
  • Поставщик JavaScript. Этот поставщик содержится в устаревшем расширении отладчика: JsProvider.dll. Он мостит между скриптами, написанными на языке JavaScript, и моделью данных, что позволяет произвольным формам управления отладчиком и расширяемости.

Новые поставщики могут быть написаны, которые повысят мост с другими языками (например, Python и т. д.) в модель данных. В настоящее время они будут инкапсулированы в устаревших расширениях отладчика для загрузки. Сам поставщик скриптов должен свести к минимуму зависимость с устаревшими интерфейсами подсистемы и использовать только API модели данных, где это возможно. Это позволит поставщику переноситься в другие среды с значительно большей легкостью.

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

Общие интерфейсы управления:

Интерфейс Описание
IDataModelScriptProvider Основной интерфейс, который должен реализовать поставщик скриптов. Это интерфейс, зарегистрированный в диспетчере сценариев в диспетчере моделей данных для объявления поддержки поставщика определенного типа скрипта и регистрации в определенном расширении файла.
IDataModelScript Абстракция конкретного скрипта, управляемого поставщиком. Каждый скрипт, загруженный или редактируемый, имеет отдельный экземпляр IDataModelScript
IDataModelScriptClient Клиентский интерфейс, используемый поставщиком скриптов для обмена информацией с пользовательским интерфейсом. Поставщики скриптов не реализуют этот интерфейс. Приложение, в котором размещается модель данных, которая хочет использовать поставщиков скриптов. Поставщик скриптов вызовет методы клиента скрипта для отчета о состоянии, ошибках и т. д.
IDataModelScriptHostContext Интерфейс узла, используемый поставщиком скриптов в качестве контейнера для содержимого скрипта. Как содержимое поверхности скрипта, отличной от манипуляций, которые она выполняет в объектной модели приложения отладчика, выполняется до конкретного узла отладки. Этот интерфейс позволяет поставщику скриптов получать сведения о расположении его содержимого.
IDataModelScriptTemplate Поставщики скриптов могут предоставлять один или несколько шаблонов, которые служат отправными точками для пользователей для создания скриптов. Приложение отладчика, которое предоставляет встроенный редактор, может предварительно заполнить новые скрипты с содержимым шаблона, объявленным поставщиком через этот интерфейс.
IDataModelScriptTemplateEnumerator Интерфейс перечислителя, реализующий поставщик скриптов для объявления всех поддерживаемых шаблонов.
IDataModelNameBinder Привязка имен — объект, который может связать имя в контексте со значением. Для данного выражения, например "foo.bar", привязка имен может привязать имя "bar" в контексте объекта foo и создать значение или ссылку на него. Привязки имен обычно не реализуются поставщиком скриптов; скорее, привязка по умолчанию может быть получена из модели данных и использоваться поставщиком скриптов.

Интерфейсы отладки:

Интерфейс Описание
IDataModelScriptDebug Основной интерфейс, предоставляемый поставщиком скриптов, чтобы сделать скрипт отладчиком. Класс реализации интерфейса IDataModelScript должен запрашивать ЗапросInterface для IDataModelScriptDebug, если скрипт можно отлаживать.
IDataModelScriptDebugClient Пользовательский интерфейс, который хочет предоставить возможность отладки скриптов, реализует интерфейс IDataModelScriptDebugClient. Поставщик скриптов использует этот интерфейс для передачи данных отладки назад и вперед (например, события, которые происходят, точки останова и т. д.)
IDataModelScriptDebugStack Поставщик скриптов реализует этот интерфейс для предоставления представления стека вызовов отладчику скрипта.
IDataModelScriptDebugStackFrame Поставщик скриптов реализует этот интерфейс для предоставления представления определенного кадра стека в стеке вызовов.
IDataModelScriptDebugVariableSetEnumerator Поставщик скриптов реализует этот интерфейс для предоставления набора переменных. Этот набор может представлять набор параметров функции, набор локальных переменных или набор переменных в определенной области. Точное значение зависит от того, как был приобретен интерфейс.
IDataModelScriptDebugBreakpoint Поставщик скриптов реализует этот интерфейс для предоставления понятия и контроля определенной точки останова в скрипте.
IDataModelScriptDebugBreakpointEnumerator Поставщик скриптов реализует это для перечисления всех точек останова, которые в настоящее время существуют в скрипте (независимо от того, включено или нет).

поставщик основных скриптов: IDataModelScriptProvider

Любое расширение, которое требуется быть поставщиком скриптов, должно предоставить реализацию интерфейса IDataModelScriptProvider и зарегистрировать такое в диспетчере сценариев диспетчера моделей данных с помощью метода RegisterScriptProvider. Этот основной интерфейс, который необходимо реализовать, определяется следующим образом.

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

Метод GetName возвращает имя типа скриптов (или языка), которыми управляет поставщик, как строка, выделенная с помощью метода SysAllocString. Вызывающий объект отвечает за освобождение возвращаемой строки через SysFreeString. Примеры строк, которые могут быть возвращены из этого метода, — JavaScript или NatVis. Возвращаемая строка, скорее всего, появится в пользовательском интерфейсе приложения отладчика, в котором размещена модель данных. Ни один из двух поставщиков скриптов не может возвращать то же имя (без учета регистра).

GetExtension

Метод GetExtension возвращает расширение файла для сценариев, управляемых этим поставщиком (без точки), в виде строки, выделенной с помощью метода SysAllocString. Приложение отладчика, в котором размещена модель данных (с поддержкой сценариев), делегируют открытие файлов скриптов с этим расширением поставщику скриптов. Вызывающий объект отвечает за освобождение возвращаемой строки через SysFreeString. Примеры строк, которые могут быть возвращены из этого метода, — "js" или "NatVis".

CreateScript

Метод CreateScript вызывается для создания нового скрипта. Поставщик скриптов должен возвращать новый и пустой скрипт, представленный возвращенным интерфейсом IDataModelScript при каждом вызове этого метода. Обратите внимание, что этот метод вызывается независимо от того, создает ли пользовательский интерфейс новый пустой скрипт для редактирования пользователем или загружает ли приложение отладчика скрипт с диска. Поставщик не участвует в операции ввода-вывода файлов. Он просто обрабатывает запросы от приложения размещения через потоки, передаваемые методам в IDataModelScript.

GetDefaultTemplateContent

Метод GetDefaultTemplateContent возвращает интерфейс для содержимого шаблона по умолчанию поставщика. Это содержимое, которое поставщик скриптов хотел бы предварительно заполнить в окне редактирования для только что созданного скрипта. Если поставщик скриптов не имеет шаблонов (или не содержит содержимого шаблона, указанного в качестве содержимого по умолчанию), поставщик скриптов может вернуть E_NOTIMPL из этого метода.

ПеречислениеTemplates

Метод EnumerateTemplates возвращает перечислитель, который может перечислять различные шаблоны, предоставляемые поставщиком скриптов. Содержимое шаблона — это то, что поставщик скрипта должен быть "предварительно заполнен" в окне редактирования при создании нового скрипта. Если поддерживается несколько разных шаблонов, эти шаблоны можно назвать (например, "Императивный скрипт", "Скрипт расширения") и приложение отладчика, в котором размещена модель данных, может выбрать способ представления "шаблонов" пользователю.

основной интерфейс скрипта: IDataModelScript

Основной интерфейс, который управляет отдельным скриптом, реализованным поставщиком, является интерфейсом IDataModelScript. Компонент, реализующий этот интерфейс, возвращается, когда клиент хочет создать пустой скрипт и вызывает метод CreateScript в IDataModelScriptProvider.

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

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

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

Метод GetName возвращает имя скрипта в виде выделенной строки через функцию SysAllocString. Если скрипт еще не имеет имени, метод должен вернуть значение NULL BSTR. Это не должно быть неудачно в этом обстоятельстве. Если скрипт явно переименовывается с помощью вызова метода Rename, метод GetName должен вернуть новое назначенное имя.

Переименовать

Метод Rename назначает новое имя скрипту. Реализация скрипта отвечает за сохранение этого имени и возврат его при вызове метода GetName. Это часто вызывается, когда пользовательский интерфейс выбирает сохранение как скрипта в новом имени. Обратите внимание, что переименование скрипта может повлиять на то, где приложение размещения выбирает проект содержимого скрипта.

заполнение

Метод "Заполнение" вызывается клиентом, чтобы изменить или синхронизировать "содержимое" скрипта. Это уведомление, которое делается поставщику скриптов, что код скрипта изменился. Важно отметить, что этот метод не приводит к выполнению скрипта или изменению любого из объектов, которыми управляет скрипт. Это просто уведомление поставщику скриптов о том, что содержимое скрипта изменилось таким образом, чтобы он мог синхронизировать собственное внутреннее состояние.

выполнение

Метод Execute выполняет содержимое скрипта в соответствии с последним успешным вызовом "Заполнение" и изменяет объектную модель отладчика в соответствии с этим содержимым. Если язык (или поставщик скриптов) определяет "основную функцию" - то, что автор хотел бы вызвать при нажатии мнимой кнопки "Выполнить скрипт" в пользовательском интерфейсе, такая "основная функция" не вызывается во время операции execute. Операция Execute может рассматриваться только для выполнения инициализации и обработки объектной модели (например, выполнение корневого кода и настройка точек расширяемости).

Отмена связи

Метод unlink отменяет операцию Execute. Все операции с объектной моделью или точки расширяемости, установленные во время выполнения скрипта, отменяются. После операции отмены связи скрипт может быть повторно выполнен с помощью вызова execute или его можно освободить.

IsInvocable

Метод IsInvocable возвращает, является ли скрипт неизменяемым, то есть имеет ли он "основную функцию", определяемую языком или поставщиком. Такая "основная функция" концептуально представляет собой то, что автор скрипта хотел бы вызвать, если воображаемая кнопка "Выполнение скрипта" была нажата в пользовательском интерфейсе.

InvokeMain

Если скрипт имеет "основную функцию", которая предназначена для выполнения из вызова пользовательского интерфейса, она указывает на это с помощью истинного возврата из метода IsInvocable. Затем пользовательский интерфейс может вызвать метод InvokeMain, чтобы фактически вызвать скрипт. Обратите внимание, что это отличается от Execute, которая выполняет весь корневой код и мостит скрипт к пространству имен базового узла.

**Клиент скрипта: IDataModelScriptClient **

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

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

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

ReportError

Если во время выполнения или вызова скрипта возникает ошибка, поставщик скрипта вызывает метод ReportError, чтобы уведомить пользовательский интерфейс об ошибке.

контекст узла для скрипта: IDataModelScriptHostContext

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

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

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

NotifyScriptChange

Необходимо, чтобы поставщик скриптов уведомлял узел отладки при определенных операциях, происходящих с вызовом метода в метод NotifyScriptChange в связанном контексте. Такие операции определяются как члены перечисления ScriptChangeKind

GetNamespaceObject

Метод GetNamespaceObject возвращает объект, в который поставщик скриптов может поместить любые мосты между моделью данных и скриптом. Здесь, например, поставщик скриптов может поместить объекты метода модели данных (интерфейсы IModelMethod, размещенные в IModelObject), реализация которых вызывается в соответствующих именованных функциях в скрипте.

Шаблоны для только что созданных скриптов: IDataModelScriptTemplate

Поставщики скриптов, которые хотят представить предварительно заполненное содержимое для новых сценариев (например, для помощи пользователям в написании скриптов в пользовательском интерфейсе отладчика) может сделать это, предоставив один или несколько шаблонов скриптов. Такие шаблоны — это компоненты, реализующие интерфейс IDataModelScriptTemplate и возвращаемые с помощью метода GetDefaultTemplate или метода EnumerateTemplates в поставщике скриптов.

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

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

GetName

Метод GetName возвращает имя шаблона. Это может завершиться ошибкой E_NOTIMPL, если шаблон не имеет имени. Для создания имени не требуется один шаблон по умолчанию (если такое существует). Все остальные шаблоны. Эти имена могут быть представлены в пользовательском интерфейсе в составе меню, чтобы выбрать, какой шаблон должен быть создан.

GetDescription

Метод GetDescription возвращает описание шаблона. Такое описание будет представлено пользователю в более описательных интерфейсах, чтобы помочь пользователю понять, что шаблон предназначен для выполнения. Шаблон может возвращать E_NOTIMPL из этого метода, если он не содержит описания.

GetContent

Метод GetContent возвращает содержимое (или код) шаблона. Это то, что будет предварительно заполнено в окно редактирования, если пользователь выбрал для создания скрипта из этого шаблона. Шаблон отвечает за создание (и возврат) стандартного потока по содержимому, которое клиент может извлечь.

перечисление содержимого шаблона поставщика : IDataModelScriptTemplateEnumerator

Поставщик скриптов может предоставить один или несколько шаблонов, которые предварительно заполняют содержимое созданными скриптами в некоторых пользовательских интерфейсах. Если указан любой из этих шаблонов, поставщик скриптов должен реализовать перечислитель над ними, который возвращается при вызове метода EnumerateTemplates.

Такой перечислитель является реализацией интерфейса IDataModelScriptTemplateEnumerator и определяется следующим образом.

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

Сбросить

Метод Reset сбрасывает перечислитель на позицию, в которую он был создан, до создания первого шаблона.

GetNext

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

разрешение значения имен: IDataModelNameBinder

Модель данных предоставляет стандартный способ для поставщиков сценариев определить смысл заданного имени в заданном контексте (например, определение того, какой бар означает для foo.bar), который будет работать в различных поставщиках скриптов. Этот механизм называется привязкой имен и представлен интерфейсом IDataModelNameBinder. Такой привязчик инкапсулирует набор правил о том, как разрешается имя и как справиться с разрешением конфликтов, где имя определяется несколько раз в объекте. Часть этих правил включает в себя такие вещи, как проецируемые имя (один, добавленный моделью данных) разрешается в отношении собственного имени (один в системе типов отлаживаемого языка).

Чтобы обеспечить степень согласованности между поставщиками скриптов, диспетчер сценариев модели данных предоставляет привязку имен по умолчанию. Эту привязку имен по умолчанию можно получить с помощью вызова метода GetDefaultNameBinder в интерфейсе IDataModelScriptManager. Интерфейс привязки имен определяется следующим образом.

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

Метод BindValue выполняет эквивалент contextObject.name для данного объекта в соответствии с набором правил привязки. Результатом этой привязки является значение. В качестве значения базовый поставщик скриптов не может использовать значение для выполнения назначения обратно в имя.

BindReference

Метод BindReference аналогичен BindValue в том, что он также выполняет эквивалент contextObject.name для заданного объекта в соответствии с набором правил привязки. Результатом привязки из этого метода является ссылка, а не значение. В качестве ссылки поставщик скриптов может использовать ссылку для выполнения назначения обратно в имя.

EnumerateValues

Метод EnumerateValues перечисляет набор имен и значений, которые привязываются к объекту в соответствии с правилами метода BindValue. В отличие от методов EnumerateKeys, EnumerateValues и аналогичных методов в IModelObject, которые могут возвращать несколько имен с одинаковым значением (для базовых классов, родительских моделей и т. д.), этот перечислитель возвращает только определенный набор имен, которые привязываются с BindValue и BindReference. Имена никогда не будут повторяться. Обратите внимание, что значительно выше стоимость перечисления объекта через привязку имен, чем вызов методов IModelObject.

ПеречислениеReferences

Метод EnumerateReferences перечисляет набор имен и ссылок на них, которые привязываются к объекту в соответствии с правилами метода BindReference. В отличие от методов EnumerateKeys, EnumerateValues и аналогичных методов в IModelObject, которые могут возвращать несколько имен с одинаковым значением (для базовых классов, родительских моделей и т. д.), этот перечислитель возвращает только определенный набор имен, которые привязываются с BindValue и BindReference. Имена никогда не будут повторяться. Обратите внимание, что значительно выше стоимость перечисления объекта через привязку имен, чем вызов методов IModelObject.

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

Инфраструктура для поставщиков сценариев в модели данных также предоставляет концепцию для отладки скриптов. Любой скрипт, который хочет предоставить возможности отладки узлу отладки и приложению отладчика, в котором размещена модель данных, может сделать это, выполнив отладочные скрипты, реализуя интерфейс IDataModelScriptDebug в дополнение к интерфейсу IDataModelScript. Наличие этого интерфейса в скрипте указывает на инфраструктуру, которую можно отлаживать.

Хотя интерфейс IDataModelScriptDebug является отправной точкой для получения доступа к возможностям отладки поставщика скриптов, он присоединяется к набору других интерфейсов при предоставлении общих возможностей отладки.

Интерфейсы отладки:

Интерфейс Описание
IDataModelScriptDebug Основной интерфейс, предоставляемый поставщиком скриптов, чтобы сделать скрипт отладчиком. Класс реализации интерфейса IDataModelScript должен запрашивать ЗапросInterface для IDataModelScriptDebug, если скрипт можно отлаживать.
IDataModelScriptDebugClient Пользовательский интерфейс, который хочет предоставить возможность отладки скриптов, реализует интерфейс IDataModelScriptDebugClient. Поставщик скриптов использует этот интерфейс для передачи данных отладки назад и вперед (например, события, которые происходят, точки останова и т. д.)
IDataModelScriptDebugStack Поставщик скриптов реализует этот интерфейс для предоставления представления стека вызовов отладчику скрипта.
IDataModelScriptDebugStackFrame Поставщик скриптов реализует этот интерфейс для предоставления представления определенного кадра стека в стеке вызовов.
IDataModelScriptDebugVariableSetEnumerator Поставщик скриптов реализует этот интерфейс для предоставления набора переменных. Этот набор может представлять набор параметров функции, набор локальных переменных или набор переменных в определенной области. Точное значение зависит от того, как был приобретен интерфейс.
IDataModelScriptDebugBreakpoint Поставщик скриптов реализует этот интерфейс для предоставления понятия и контроля определенной точки останова в скрипте.
IDataModelScriptDebugBreakpointEnumerator Поставщик скриптов реализует это для перечисления всех точек останова, которые в настоящее время существуют в скрипте (независимо от того, включено или нет).

Общие интерфейсы управления:

Интерфейс Описание
IDataModelScriptProvider Основной интерфейс, который должен реализовать поставщик скриптов. Это интерфейс, зарегистрированный в диспетчере сценариев в диспетчере моделей данных для объявления поддержки поставщика определенного типа скрипта и регистрации в определенном расширении файла.
IDataModelScript Абстракция конкретного скрипта, управляемого поставщиком. Каждый скрипт, загруженный или редактируемый, имеет отдельный экземпляр IDataModelScript
IDataModelScriptClient Клиентский интерфейс, используемый поставщиком скриптов для обмена информацией с пользовательским интерфейсом. Поставщики скриптов не реализуют этот интерфейс. Приложение, в котором размещается модель данных, которая хочет использовать поставщиков скриптов. Поставщик скриптов вызовет методы клиента скрипта для отчета о состоянии, ошибках и т. д.
IDataModelScriptHostContext Интерфейс узла, используемый поставщиком скриптов в качестве контейнера для содержимого скрипта. Как содержимое поверхности скрипта, отличной от манипуляций, которые она выполняет в объектной модели приложения отладчика, выполняется до конкретного узла отладки. Этот интерфейс позволяет поставщику скриптов получать сведения о расположении его содержимого.
IDataModelScriptTemplate Поставщики скриптов могут предоставлять один или несколько шаблонов, которые служат отправными точками для пользователей для создания скриптов. Приложение отладчика, которое предоставляет встроенный редактор, может предварительно заполнить новые скрипты с содержимым шаблона, объявленным поставщиком через этот интерфейс.
IDataModelScriptTemplateEnumerator Интерфейс перечислителя, реализующий поставщик скриптов для объявления всех поддерживаемых шаблонов.
IDataModelNameBinder Привязка имен — объект, который может связать имя в контексте со значением. Для данного выражения, например "foo.bar", привязка имен может привязать имя "bar" в контексте объекта foo и создать значение или ссылку на него. Привязки имен обычно не реализуются поставщиком скриптов; Скорее, привязка по умолчанию может быть получена из модели данных и использоваться поставщиком скриптов.

отладка скриптов: IDataModelScriptDebug

Любой скрипт, который можно отлаживать, указывает на эту возможность через наличие интерфейса IDataModelScriptDebug на том же компоненте, который реализует IDataModelScript. Запрос к этому интерфейсу узлом отладки или приложением отладчика, на котором размещена модель данных, указывает на наличие возможности отладки.

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

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

Метод GetDebugState возвращает текущее состояние скрипта (например, выполняется ли он или нет). Состояние определяется значением перечисления ScriptDebugState.

GetCurrentPosition

Метод GetCurrentPosition возвращает текущую позицию в скрипте. Это может вызываться только в том случае, если скрипт разбивается на отладчик, где вызов GetScriptState возвращает ScriptDebugBreak. Любой другой вызов этого метода недопустим и завершится ошибкой.

GetStack

Метод GetStack получает текущий стек вызовов в позиции останова. Этот метод может вызываться только в том случае, если скрипт разбивается на отладчик.

SetBreakpoint

Метод SetBreakpoint задает точку останова в скрипте. Обратите внимание, что реализация свободна для настройки неустранимой линии и позиций столбцов, чтобы перейти к соответствующей позиции кода. Фактические номера строк и столбцов, в которых была размещена точка останова, можно получить с помощью вызовов методов для возвращаемого интерфейса IDataModelScriptDebugBreakpoint.

FindBreakpointById

Каждая точка останова, созданная в скрипте с помощью метода SetBreakpoint, назначается уникальным идентификатором (64-разрядное целое число без знака) реализацией. Метод FindBreakpointById используется для получения интерфейса в точку останова с заданного идентификатора.

ПеречислениеBreakpoints

Метод EnumerateBreakpoints возвращает перечислитель, способный перечислять каждую точку останова, заданную в определенном скрипте.

GetEventFilter

Метод GetEventFilter возвращает, включена ли функция "разрыв события" для определенного события. События, которые могут вызвать прерывание события, описываются членом перечисления ScriptDebugEventFilter.

SetEventFilter

Метод SetEventFilter изменяет поведение "break on event" для определенного события, как определено членом перечисления ScriptDebugEventFilter. Полный список доступных событий (и описание этого перечисления) можно найти в документации для метода GetEventFilter.

StartDebugging

Метод StartDebugging "включает" отладчик для определенного скрипта. Действие запуска отладки не приводит к разрыву выполнения или пошаговому выполнению. Он просто делает скрипт отладчиком и предоставляет набор интерфейсов для взаимодействия клиента с интерфейсом отладки.

StopDebugging

Метод StopDebugging вызывается клиентом, который хочет остановить отладку. Этот вызов метода может быть выполнен в любой момент после успешного выполнения StartDebugging (например, во время перерыва, во время выполнения скрипта и т. д.). Вызов немедленно прекращает все действия отладки и сбрасывает состояние до вызова StartDebugging.

интерфейс отладки: IDataModelScriptDebugClient

Узел отладки или приложение отладчика, которое хочет предоставить интерфейс для отладки скрипта, должно предоставить реализацию интерфейса IDataModelScriptDebugClient с помощью метода StartDebugging в интерфейсе отладки скрипта.

IDataModelScriptDebugClient — это канал связи, через который передаются события отладки, а управление переходит от обработчика выполнения скрипта к интерфейсу отладчика. Он определен следующим образом.

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

NotifyDebugEvent

Всякий раз, когда возникает любое событие, которое прерывается в отладчик скрипта, сам код отладки вызывает интерфейс с помощью метода NotifyDebugEvent. Этот метод синхронен. Выполнение скрипта не возобновляется до тех пор, пока интерфейс не возвращается из события. Определение отладчика скрипта предназначено для простого: не требуется обработка вложенных событий. Событие отладки определяется вариантной записью, известной как ScriptDebugEventInformation. Допустимые поля в сведениях о событии в значительной степени определяются членом DebugEvent. Он определяет тип события, которое произошло, как описано членом перечисления ScriptDebugEvent.

стек вызовов: IDataModelScriptDebugStack

При возникновении события, которое прерывается в отладчик скрипта, интерфейс отладки хочет получить стек вызовов для расположения останова. Это делается с помощью метода GetStack. Такой стек выражается с помощью IDataModelScriptDebugStack, который определяется как указано ниже.

Обратите внимание, что общий стек может охватывать несколько сценариев и (или) нескольких поставщиков сценариев. Стек вызовов, возвращаемый из одного вызова метода GetStack в интерфейсе отладки конкретного скрипта, должен возвращать только сегмент стека вызовов в пределах этого скрипта. Вполне возможно, что подсистема отладки скриптов может получить стек вызовов, охватывая несколько контекстов скриптов, если два сценария одного поставщика взаимодействуют. Метод GetStack не должен возвращать часть стека, которая находится в другом скрипте. Вместо этого, если эта ситуация может быть обнаружена, кадр стека, который является фреймом границы в скрипте, должен пометить себя как кадр перехода через реализацию методов IsTransitionPoint и GetTransition в этом кадре стека. Ожидается, что интерфейс отладчика объединяет общий стек из нескольких сегментов стека, которые существуют.

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

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

GetFrameCount

Метод GetFrameCount возвращает количество кадров стека в этом сегменте стека вызовов. Если поставщик может обнаруживать кадры в разных контекстах скриптов или разных поставщиках, он должен указать это вызывающему объекту путем реализации методов IsTransitionPoint и GetTransition в кадре входа в этом сегменте стека.

GetStackFrame

GetStackFrame получает определенный кадр стека из сегмента стека. Стек вызовов имеет систему индексирования на основе нуля: текущий кадр стека, в котором произошло событие разрыва, — кадр 0. Вызывающий объект текущего метода — кадр 1 (и т. д.).

проверка состояния при сбое: IDataModelScriptDebugStackFrame

Определенный кадр стека вызовов при разрыве в отладчик скрипта можно получить с помощью вызова метода GetStackFrame в интерфейсе IDataModelScriptDebugStack, представляющего сегмент стека, в котором произошел разрыв. Интерфейс IDataModelScriptDebugStackFrame, возвращаемый для представления этого кадра, определен следующим образом.

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

Метод GetName возвращает отображаемое имя (например, имя функции) этого кадра. Это имя будет отображаться в стеке backtrace, представленном пользователю в интерфейсе отладчика.

GetPosition

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

IsTransitionPoint

Интерфейс IDataModelScriptDebugStack представляет сегмент стека вызовов — эту часть стека вызовов, которая содержится в контексте одного скрипта. Если отладчик может обнаруживать переход из одного скрипта в другой (или один поставщик скриптов в другой), он может указать это, реализуя метод IsTransitionPoint и возвращая значение true или false в соответствии с соответствующим образом. Кадр стека вызовов, введенный в скрипт, в котором применяется сегмент, должен считаться точкой перехода. Все остальные кадры не являются.

GetTransition

Если заданный кадр стека является точкой перехода, определяемой методом IsTransition (см. документацию по определению точек перехода), метод GetTransition возвращает сведения о переходе. В частности, этот метод возвращает предыдущий скрипт — тот, который вызвал скрипт, представленный сегментом стека, содержащим этот IDataModelScriptDebugStackFrame.

оценка

Метод Evaluate вычисляет выражение (языка поставщика скриптов) в контексте кадра стека, представленного интерфейсом IDataModelScriptDebugStackFrame, на котором был вызван этот метод. Результат вычисления выражения должен быть маршалирован из поставщика скриптов в виде IModelObject. Свойства и другие конструкции в результирующем объекте IModelObject должны быть получены, пока отладчик находится в состоянии останова.

EnumerateLocals

Метод EnumerateLocals возвращает переменный набор (представленный интерфейсом IDataModelScriptDebugVariableSetEnumerator) для всех локальных переменных, которые находятся в области в контексте кадра стека, представленного интерфейсом IDataModelScriptDebugStackFrame, на котором был вызван этот метод.

ПеречислениеArguments

Метод EnumerateArguments возвращает переменный набор (представленный интерфейсом IDataModelScriptDebugVariableSetEnumerator) для всех аргументов функции, вызываемой в кадре стека, представленного интерфейсом IDataModelScriptDebugStackFrame, на котором был вызван этот метод.

Просмотр переменных: IDataModelScriptDebugVariableSetEnumerator

Набор переменных в отлаживаемом скрипте (будь то в определенной области, локальные экземпляры функции, аргументы функции и т. д.) представлен набором переменных, определенным через интерфейс 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;
}

Сбросить

Метод Reset сбрасывает положение перечислителя в место, где оно было сразу после создания, то есть перед первым элементом набора.

GetNext

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

точки останова : IDataModelScriptDebugBreakpoint

Точки останова скрипта задаются с помощью метода SetBreakpoint в интерфейсе отладки данного скрипта. Такие точки останова представлены уникальным идентификатором и реализацией интерфейса IDataModelScriptDebugBreakpoint, который определяется следующим образом.

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

Метод GetId возвращает уникальный идентификатор, назначенный обработчиком отладки поставщика скриптов точке останова. Этот идентификатор должен быть уникальным в контексте содержащего скрипта. Идентификатор точки останова может быть уникальным для поставщика; однако это не обязательно.

IsEnabled

Метод IsEnabled возвращает, включена ли точка останова. Отключенная точка останова по-прежнему существует и по-прежнему находится в списке точек останова для скрипта, он просто "отключен" временно. Все точки останова должны быть созданы в состоянии включено.

включить

Метод Enable включает точку останова. Если точка останова отключена, после вызова этого метода отладчик приведет к разрыву.

Отключить

Метод Disable отключает точку останова. После этого вызова после вызова отладчик не будет прерываться после вызова этой точки останова. Точка останова, по-прежнему присутствующая, считается "отключенной".

Удалить

Метод Remove удаляет точку останова из своего содержащего списка. Точка останова больше не существует семантической после возврата этого метода. Интерфейс IDataModelScriptDebugBreakpoint, представляющий точку останова, считается потерянным после вызова. Ничего другого не может (юридически) быть сделано с ним после этого вызова, кроме освобождения его.

GetPosition

Метод GetPosition возвращает позицию точки останова в скрипте. Отладчик скрипта должен возвращать строку и столбец в исходном коде, где находится точка останова. Если он способен сделать это, он также может вернуть диапазон источника, представленного точкой останова, заполнив конечную позицию, как определено аргументом positionSpanEnd. Если отладчик не способен производить этот диапазон и вызывающий запрашивает его, поля строки и столбца конечной позиции диапазона должны быть заполнены как ноль, указывающий, что значения не могут быть предоставлены.

перечисление точек останова : IDataModelScriptDebugBreakpointEnumerator

Если поставщик скриптов поддерживает отладку, он также должен отслеживать все точки останова, связанные с каждым скриптом, и иметь возможность перечислять эти точки останова в интерфейс отладки. Перечислитель для точек останова получается с помощью метода EnumerateBreakpoints в интерфейсе отладки для данного скрипта и определяется следующим образом.

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

Сбросить

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

GetNext

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


См. также

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

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

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

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

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

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