IDataModelConcept::InitializeObject 方法 (dbgmodel.h)
数据模型可以通过数据模型管理器的 RegisterModelForTypeSignature 或 RegisterExtensionForTypeSignature 方法注册为规范可视化工具或给定本机类型的扩展。 通过这两种方法之一注册模型时,数据模型将自动作为父模型附加到任何本机对象,其类型与注册中传递的签名匹配。 在自动创建该附件时,对数据模型调用 InitializeObject 方法。 它将传递实例对象、导致附件的类型签名,以及生成类型实例的枚举器 (线性顺序) 与类型签名中的任何通配符匹配。 数据模型实现可以使用此方法调用来初始化它所需的任何缓存。
语法
HRESULT InitializeObject(
IModelObject *modelObject,
IDebugHostTypeSignature *matchingTypeSignature,
IDebugHostSymbolEnumerator *wildcardMatches
);
参数
modelObject
正在初始化的实例对象。
matchingTypeSignature
modelObject 的本机类型所匹配、导致数据模型附件的类型签名。
wildcardMatches
如果匹配的类型签名包含通配符,则此参数将包含枚举器,该枚举器将枚举每个通配符的匹配方式。 通常,此处枚举的每个 IDebugHostSymbol 都是 一个 IDebugHostType。 然而,这不是一项要求。 非类型模板参数 () 可以匹配通配符,并生成 IDebugHostConstant 等符号。
返回值
此方法返回指示成功或失败的 HRESULT。 如果此方法失败,将阻止实例的对象构造。
注解
请注意,给定的数据模型实现不能假定将对数据模型附加到的每个对象进行 InitializeObject 调用。 由于数据模型是一个完全动态的系统,因此调用方完全可以通过 IModelObject 上的 GetParentModel 方法直接获取模型 () 并手动附加它。 在这种情况下,不会进行 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;
}
要求
要求 | 值 |
---|---|
Header | dbgmodel.h |