Метод 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 |