Метод IDataModelManager4::RegisterModelForTypeSignature (dbgmodel.h)

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

A) std::pair<*, *>
B) std::pair<int, *>
C) std::pair<int, float>

Если указанные выше сигнатуры трех типов (A, B и C) регистрируются и проверяются на конкретный тип:

std::pair<int, float>

Сигнатуры Alltype соответствуют этому экземпляру типа. Второй — это лучшее совпадение, чем первое, так как 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<IDataModelManager4> 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

См. также

интерфейс IDataModelManager4