Partager via


Méthode IDataModelConcept ::InitializeObject (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é par le biais des 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 à tout 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 reçoit l’objet instance, la signature de type à l’origine de la pièce jointe et un énumérateur qui produit les instances de type (dans l’ordre linéaire) qui correspondent aux caractères génériques de 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 instance en cours d’initialisation.

matchingTypeSignature

Signature de type à laquelle correspond le type natif de modelObject qui a provoqué 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 correspondance de chaque caractère générique. En règle générale, chaque IDebugHostSymbol énuméré ici est un IDebugHostType. Ce n’est pas, cependant, 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 retournée

Cette méthode retourne HRESULT qui indique la réussite ou l’échec. En cas d’échec, cette méthode empêche la construction d’objets du 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 entièrement dynamique, il est tout à fait possible pour un appelant d’acquérir directement un modèle (via, par exemple, la méthode GetParentModel sur IModelObject) et de l’attacher manuellement. Dans ce cas, l’appel InitializeObject n’aura 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;
}

Configuration requise

Condition requise Valeur
En-tête dbgmodel.h

Voir aussi

Interface IDataModelConcept