Partager via


IDataModelConcept ::InitializeObject, méthode (dbgmodel.h)

Un modèle de données peut être inscrit en tant que visualiseur canonique ou en tant qu’extension pour un type natif donné via les méthodes RegisterModelForTypeSignature ou RegisterExtensionForTypeSignature du gestionnaire de modèles de données. Lorsqu’un modèle est inscrit via l’une de ces méthodes, le modèle de données est automatiquement attaché en tant que modèle parent à n’importe quel objet natif dont le type correspond à la signature passée dans l’inscription. Au moment où cette pièce jointe est automatiquement effectuée, la méthode InitializeObject est appelée sur le modèle de données. Il est passé l’objet d’instance, la signature de type qui a provoqué la pièce jointe et un énumérateur qui produit les instances de type (dans l’ordre linéaire) qui correspondent à tous les caractères génériques dans la signature de type. L’implémentation du modèle de données peut utiliser cet appel de méthode pour initialiser les caches dont elle a besoin.

Syntaxe

HRESULT InitializeObject(
  IModelObject               *modelObject,
  IDebugHostTypeSignature    *matchingTypeSignature,
  IDebugHostSymbolEnumerator *wildcardMatches
);

Paramètres

modelObject

Objet d’instance en cours d’initialisation.

matchingTypeSignature

Signature de type sur laquelle le type natif de modelObject correspondait à l’origine de la pièce jointe du modèle de données.

wildcardMatches

Si la signature de type correspondant inclut des caractères génériques, cet argument contient un énumérateur qui énumère la façon dont chaque caractère générique correspond. En règle générale, chaque IDebugHostSymbol énuméré ici est un IDebugHostType. Mais ce n’est pas une exigence. Les arguments de modèle non de type (entre autres) peuvent correspondre à des caractères génériques et peuvent produire des symboles tels que IDebugHostConstant.

Valeur de retour

Cette méthode retourne HRESULT qui indique la réussite ou l’échec. L’échec de cette méthode empêche la construction d’objets de l’instance.

Remarques

Notez qu’une implémentation de modèle de données donnée ne peut pas supposer que l’appel InitializeObject sera effectué pour chaque objet auquel le modèle de données est attaché. Étant donné que le modèle de données est un système complètement dynamique, il est tout à fait possible pour un appelant d’acquérir directement un modèle (par exemple, la méthode GetParentModel sur IModelObject) et de l’attacher manuellement. Dans ce cas, l’appel InitializeObject n’a pas été effectué et l’implémentation doit être prête à le faire. L’appel de cette méthode est une optimisation pour permettre aux implémentations coûteuses de préremplir et de préinitialiser les caches requis.

Exemple d’implémentation

Notez qu’un client n’appelle jamais cette interface.

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

Exigences

Exigence Valeur
d’en-tête dbgmodel.h

Voir aussi

interface IDataModelConcept