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

要求

要求 价值
标头 dbgmodel.h

另请参阅

IDataModelManager3 接口