Partager via


Méthode IDataModelManager ::RegisterModelForTypeSignature (dbgmodel.h)

La méthode RegisterModelForTypeSignature est la méthode principale qu’un appelant utilise pour inscrire un visualiseur canonique pour un type (ou ensemble de types) donné. Un visualiseur canonique est un modèle de données qui, en effet, prend en charge l’affichage d’un type (ou d’un ensemble de types donné). Au lieu d’afficher la vue native/linguistique du type dans une interface utilisateur de débogueur, l’affichage du type tel que présenté par le modèle de données inscrit s’affiche (ainsi qu’un moyen de revenir à l’affichage natif/linguistique pour un utilisateur qui le souhaite). La signature de type passée à cette méthode peut correspondre à plusieurs types concrets. S’il existe plusieurs correspondances pour un type donné instance, seule la meilleure correspondance est retournée. Une signature de type est considérée comme une meilleure correspondance qu’une autre si elle fait référence plus spécifiquement à un type concret donné. À titre d’exemple :

A) std::pair<*, *>
B) std::pair<int, *>
C) std::pair<int, float>

Si les trois signatures de type ci-dessus (A, B et C) sont inscrites et vérifiées par rapport à un type concret :

std::pair<int, float>

Les signatures Alltype correspondent à ce type instance. Le deuxième est une meilleure correspondance que la première, car int (le premier argument de modèle de B) est une meilleure correspondance qu’un caractère générique (le premier argument de modèle de A). De même, le troisième est une meilleure correspondance que la deuxième (il s’agit d’une correspondance totale sans caractères génériques).

La méthode RegisterModelForTypeSignature n’autorise pas l’inscription de signatures de type en double. Un seul modèle de données peut être inscrit en tant que visualiseur canonique pour une signature de type donnée. Une tentative d’inscription de la même signature de type à deux reprises échoue. De même, la méthode RegisterModelForTypeSignature n’autorise pas l’inscription de signatures de type qui peuvent correspondre de façon ambiguë à n’importe quel type instance. Par exemple :

D) std::pair<int, *>
E) std::pair<*, int>

Les deux signatures de type ci-dessus (D et E) ne peuvent pas toutes les deux être inscrites. Pour certains types, il est clair quelle signature s’applique et est la meilleure. Par exemple,

std::pair<int, float>

Correspond uniquement au premier d’entre eux (D), car float et int ne correspondent pas. Toutefois, il est complètement ambigu lorsque l’on considère les éléments suivants :

std::pair<int, int>

L’une ou l’autre de ces signatures est également bonne (toutes deux ont une correspondance concrète et une correspondance à caractère générique). Ces signatures de type sont ambiguës. Par conséquent, un appel pour inscrire le deuxième d’entre eux échouera pour cette raison.

Syntaxe

HRESULT RegisterModelForTypeSignature(
  IDebugHostTypeSignature *typeSignature,
  IModelObject            *dataModel
);

Paramètres

typeSignature

Signature de type en cours d’inscription. Tout objet natif/langage d’un type concret qui correspond le mieux à cette signature de type aura le modèle de données donné par l’argument dataModel automatiquement attaché.

dataModel

Modèle de données qui doit devenir le visualiseur canonique pour les types correspondant à la signature de type donnée.

Valeur retournée

Cette méthode retourne HRESULT qui indique la réussite ou l’échec. Cette méthode ne parvient pas à inscrire des signatures de type identiques ou ambiguës.

Remarques

Exemple de Code

ComPtr<IDataModelManager> 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.
        }
    }
}

Configuration requise

Condition requise Valeur
En-tête dbgmodel.h

Voir aussi

Interface IDataModelManager