Метод IDataModelManager2::RegisterModelForTypeSignature (dbgmodel.h)
Метод RegisterModelForTypeSignature является основным методом, который вызывающий объект использует для регистрации канонического визуализатора для заданного типа (или набора типов). Канонический визуализатор — это модель данных, которая фактически берет на себя отображение заданного типа (или набора типов). Вместо собственного или языкового представления типа, отображаемого в любом пользовательском интерфейсе отладчика, отображается представление типа, представленное зарегистрированной моделью данных (вместе со средством возврата к представлению на родном языке для пользователя, которому оно требуется). Сигнатура типа, передаваемая этому методу, может соответствовать нескольким конкретным типам. Если для данного экземпляра типа имеется несколько совпадений, возвращается только наилучшее совпадение. Одна сигнатура типа считается лучшим совпадением, чем другая, если она более конкретно относится к конкретному типу. Примеры:
A) std::pair<*, *>
B) std::pair<int, *>
C) std::pair<int, float>
Если три сигнатуры типов выше (A, B и C) зарегистрированы и проверены на соответствие конкретному типу:
std::pair<int, float>
Все сигнатуры типа соответствуют этому экземпляру типа. Второе совпадение лучше, чем первое, так как int (первый аргумент шаблона B) является лучшим совпадением, чем подстановочный знак (первый аргумент шаблона A). Кроме того, третий является лучшим совпадением, чем второй (это общее совпадение без подстановочных знаков). Метод RegisterModelForTypeSignature не позволяет регистрировать повторяющиеся сигнатуры типов. В качестве канонического визуализатора для заданной сигнатуры типа можно зарегистрировать только одну модель данных. Попытка дважды зарегистрировать одну и ту же сигнатуру типа завершится ошибкой. Аналогичным образом, метод RegisterModelForTypeSignature не разрешает сигнатуры типов, которые могут неоднозначно соответствовать любому экземпляру типа для регистрации. Например:
D) std::pair<int, *>
E) std::pair<*, int>
Две приведенные выше сигнатуры типа (D и E) не могут быть зарегистрированы. Для некоторых типов ясно, какая сигнатура применяется и является лучшей. Например,
std::pair<int, float>
Соответствует только первому из них (D), так как float и int не совпадают. Однако это совершенно неоднозначно при рассмотрении следующего:
std::pair<int, int>
Любая из этих сигнатур одинаково хороша (обе имеют одно конкретное и одно совпадение с подстановочными знаками). Эти сигнатуры типов неоднозначны. Поэтому вызов для регистрации второго из них по этой причине завершится ошибкой.
Синтаксис
HRESULT RegisterModelForTypeSignature(
IDebugHostTypeSignature *typeSignature,
IModelObject *dataModel
);
Параметры
typeSignature
Регистремая сигнатура типа. Любой собственный или языковой объект конкретного типа, который лучше всего соответствует этой сигнатуре типа, будет автоматически присоединена к модели данных, заданной аргументом dataModel.
dataModel
Модель данных, которая должна стать каноническим визуализатором для типов, соответствующих заданной сигнатуре типа.
Возвращаемое значение
Этот метод возвращает HRESULT, который указывает на успех или сбой. Этот метод не сможет зарегистрировать идентичные или неоднозначные сигнатуры типов.
Комментарии
Образец кода
ComPtr<IDataModelManager2> spManager; /* get the data model manager */
ComPtr<IDebugHost> spHost; /* get the debug host */
ComPtr<IModelObject> spDataModel; /* create a data model (see
CreateDataModelObject) */
ComPtr<IDebugHostSymbols> spSym;
if (SUCCEEDED(spHost.As(&spSym)))
{
// Create a signature to match MyType<*>
ComPtr<IDebugHostTypeSignature> spTypeSignature;
if (SUCCEEDED(spSym->CreateTypeSignature(L"MyType<*>",
nullptr,
&spTypeSignature)))
{
// Register the model for std::vector<*>
if (SUCCEEDED(spManager->RegisterModelForTypeSignature(spTypeSignature.Get(),
spDataModel.Get()))
{
// Every instance matching MyType<*> will now have spDataModel
// attached as the parent. Further, such parent is considered
// the canonical visualizer for all types matching MyType<*> since
// it was registered via RegisterModelForTypeSignature instead of
// RegisterExtensionForTypeSignature.
}
}
}
Требования
Требование | Значение |
---|---|
Заголовок | dbgmodel.h |