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


Метод IDataModelConcept::InitializeObject (dbgmodel.h)

Модель данных может быть зарегистрирована в качестве канонического визуализатора или в качестве расширения для заданного собственного типа с помощью методов RegisterModelForTypeSignature или RegisterExtensionForTypeSignature. При регистрации модели с помощью любого из этих методов модель данных автоматически присоединяется как родительская модель к любому собственному объекту, тип которого соответствует сигнатуре, переданной в регистрации. На момент автоматического выполнения этого вложения метод InitializeObject вызывается в модели данных. Он передает объект экземпляра, сигнатуру типа, которая вызвала вложение, и перечислитель, который создает экземпляры типов (в линейном порядке), которые соответствовали любым подстановочным знакам в сигнатуре типа. Реализация модели данных может использовать этот вызов метода для инициализации всех необходимых кэшей.

Синтаксис

HRESULT InitializeObject(
  IModelObject               *modelObject,
  IDebugHostTypeSignature    *matchingTypeSignature,
  IDebugHostSymbolEnumerator *wildcardMatches
);

Параметры

modelObject

Объект экземпляра, который инициализирован.

matchingTypeSignature

Сигнатура типа, с которой соответствовал собственный тип modelObject, вызвавшее вложение модели данных.

wildcardMatches

Если сигнатура соответствующего типа содержит подстановочные знаки, этот аргумент будет содержать перечислитель, который будет перечислять соответствие каждого подстановочного знака. Как правило, каждый IDebugHostSymbol перечислен здесь является IDebugHostType. Это, однако, не требование. Аргументы шаблонов без типов (среди прочего) могут соответствовать подстановочным знакам и могут создавать символы, такие как IDebugHostConstant.

Возвращаемое значение

Этот метод возвращает HRESULT, указывающий на успех или сбой. Сбой этого метода предотвратит создание объекта экземпляра.

Замечания

Обратите внимание, что данная реализация модели данных не может предположить, что вызов InitializeObject будет выполнен для каждого объекта, к которому подключена модель данных. Так как модель данных является полностью динамической системой, вызывающий объект может напрямую получить модель (например, метод GetParentModel на IModelObject) и подключить его вручную. В таких обстоятельствах вызов InitializeObject не будет выполнен, и реализация должна быть готова к таким действиям. Вызов этого метода — это оптимизация, позволяющая дорогостоящим реализациям предварительно заполнить и предварительно инициализировать необходимые кэши.

Пример реализации

Обратите внимание, что клиент никогда не будет вызывать этот интерфейс.

//
// InitializeObject is an implementation of the interface method on some 
// class representing a data model.  Consider that the class has a GetObject() method
// which returns the IModelObject for the data model
//
// Let's also imagine that this registered for the type signature "std::vector<*>"
//
IFACEMETHOD(InitializeObject)(_In_ IModelObject *pContextObject, _In_ IDebugHostTypeSignature *pTypeSignature, _In_ IDebugHostSymbolEnumerator *pWildcardMatches)
{
    HRESULT hr = S_OK;

    // The minimal implementation is "return S_OK;"
    // Typically, this is used to fill cache information.  Imagine we have a 
    // cache in the context data.
    ComPtr<IUnknown> spCtxData;
    hr = pContextObject->GetContextForDataModel(GetObject(), &spCtxData));
    if (SUCCEEDED(hr))
    {
        CacheData *pCacheData = static_cast<CacheData *>(spCtxData.Get());

        // Find the instance type.  This is the template argument(s) which 
        // matched the * in 'std::vector<*>'
        ComPtr<IDebugHostSymbol> spFirstMatch;
        hr = pWildcardMatches->GetNext(&spFirstMatch));
        if (SUCCEEDED(hr))
        {
            SymnbolKind sk;
            ComPtr<IDebugHostType> spFirstType;
            if (SUCCEEDED(hr = spFirstMatch->GetSymbolKind(&sk)) && sk == SymbolType &&
                SUCCEEDED(hr = spFirstMatch.As(&spFirstType))))
            {
                pCacheData->SetInstanceType(spFirstType.Get()));
            }
        }
    }

    return hr;
}

Требования

Требование Ценность
заголовка dbgmodel.h

См. также

интерфейс IDataModelConcept