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;
}

要求

要求 价值
标头 dbgmodel.h

另请参阅

IDataModelConcept 接口