Partager via


IModelObject ::SetContextForDataModel, méthode (dbgmodel.h)

La méthode SetContextForDataModel est utilisée par l’implémentation d’un modèle de données pour placer des données d’implémentation sur instance objets. Conceptuellement, chaque IModelObject (appelé le instance par souci de simplicité) contient une table de hachage d’état. La table de hachage est indexée par un autre IModelObject (appelé modèle de données par souci de simplicité) qui se trouve dans la hiérarchie du modèle parent de l’instance. La valeur contenue dans ce hachage est un ensemble d’informations d’état comptées de référence représentées par un instance IUnknown. Une fois que le modèle de données définit cet état sur le instance il peut stocker des données d’implémentation arbitraires qui peuvent être récupérées pendant des opérations telles que les getters de propriétés.

Il est souvent le cas que les extensions (ou d’autres composants de modèle de données) veulent représenter une construction synthétique comme ce que l’on peut considérer comme un type. L’exposition d’objets de processus par le débogueur en est un exemple. Souvent, une implémentation mappe la notion de définition de type à un modèle de données. Le modèle de données contient des getters de propriétés pour les éléments exposés sur l’objet (par exemple : nom du processus, ID de processus, nombre de threads, threads, etc.). Lorsqu’il est temps de créer un instance de ce modèle de données, un objet synthétique vide est créé et le modèle de données (ou ce que nous pourrions considérer comme la définition de type) est attaché en tant que modèle parent. Dans certains cas, suffisamment d’informations pour identifier l’objet de manière unique et implémenter tous les getters de propriété du modèle de données peuvent être placés directement sur l’objet instance. Dans notre exemple de processus, l’ID de processus peut être stocké sous la forme d’une clé nommée Id sur le instance. Lorsqu’un getter sur le modèle de données est appelé, par exemple pour le nom du processus, l’implémentation peut simplement appeler la méthode GetKeyValue pour extraire l’ID de processus. L’implémentation nécessaire pour retourner le nom peut ensuite le faire à partir du PID. Dans d’autres cas, l’état requis pour implémenter le type est plus complexe, contient d’autres constructions natives ou, pour d’autres raisons, ne peut pas être défini en tant que clé instance. Dans ce cas, le modèle de données construit une classe dérivée IUnknown, place les données d’implémentation dans cette classe et appelle la méthode SetContextForDataModel sur le instance afin d’associer ses données d’implémentation à l’objet instance. Lorsque le instance se décompose, le nombre de références sur la classe d’état est libéré et libéré en fonction des besoins.

Syntaxe

HRESULT SetContextForDataModel(
  IModelObject *dataModelObject,
  IUnknown     *context
);

Paramètres

dataModelObject

IModelObject représentant le modèle de données pour lequel l’état est stocké sur un objet instance. Il s’agit, en fait, d’une clé de hachage pour l’objet d’état associé.

context

État associé au instance. La signification exacte de cela (et de toutes les autres interfaces, etc. qu’il prend en charge) incombe au modèle de données qui effectue l’appel de définir cet état. La seule exigence est que cet état soit compté référence COM.

Valeur retournée

Cette méthode retourne HRESULT qui indique la réussite ou l’échec.

Remarques

Exemple de code

ComPtr<IModelObject> spObject;          /* get an object */
ComPtr<IModelObject> spDataModelObject; /* get an attached data model (from earlier
                                           AddParentModel or from GetParentModel) anywhere in 
                                           the ancestor tree */

// Context data must be IUnknown derived.  Otherwise, implementation is opaque to the data model.
class MyContextData :
    public Microsoft::WRL::RuntimeClass<
        Microsoft::WRL::RuntimeClassFlags<Microsoft::WRL::RuntimeClassType::ClassicCom>,
        IUnknown
        >
{
    /* put whatever you want here */
};

ComPtr<MyContextData> spContextData = Microsoft::WRL::Make<MyContextData>();
if (SUCCEEDED(spObject->SetContextForDataModel(spDataModelObject.Get(), spContextData.Get())))
{
    // There is now context data associated with spObject (an instance) for 
    // spDataModelObject (a parent model).  This can be fetched via
    // GetContextForDataModel.  Note that spObject and spDataModelObject only need t
    // to be related.  The model does not need to be an immediate parent.
}

Configuration requise

Condition requise Valeur
En-tête dbgmodel.h

Voir aussi

Interface IModelObject