IDataModelManager2::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<IDataModelManager2> 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.
        }
    }
}

要求

要求
Header dbgmodel.h

另请参阅

IDataModelManager2 接口