Поделиться через


Метод IModelObject::SetContextForDataModel (dbgmodel.h)

Метод SetContextForDataModel используется реализацией модели данных для размещения данных реализации в объектах экземпляра. По сути, каждый IModelObject (для простоты назовите его экземпляром) содержит хэш-таблицу состояний. Хэш-таблица индексируется другим объектом IModelObject (для простоты назовем его моделью данных), который находится в иерархии родительской модели экземпляра. Значение, содержащееся в этом хэше, представляет собой набор сведений о состоянии подсчета ссылок, представленных экземпляром IUnknown. После того как модель данных установит это состояние в экземпляре, она может хранить произвольные данные реализации, которые можно получить во время таких действий, как методы получения свойств.

Часто расширениям (или другим компонентам модели данных) требуется представить некоторую синтетическую конструкцию в качестве типа. Одним из таких примеров является предоставление отладчиком объектов процесса. Часто реализация сопоставляет понятие определения типа с моделью данных. Модель данных будет содержать методы получения свойств для объектов, которые предоставляются в объекте (например, имя процесса, идентификатор процесса, число потоков, потоки и т. д.). Когда нужно создать экземпляр этой модели данных, создается пустой искусственный объект, а модель данных (или то, что можно считать определением типа) присоединяется в качестве родительской модели. В некоторых случаях достаточно информации для уникальной идентификации объекта и реализации всех средств получения свойств модели данных может быть напрямую помещено в объект экземпляра. В нашем примере процесса идентификатор процесса может храниться в экземпляре в виде ключа с именем Id. При вызове метода получения модели данных, например для имени процесса, реализация может просто вызвать метод GetKeyValue для получения идентификатора процесса. Реализация, необходимая для возврата имени, может сделать это из PID. В других случаях состояние, необходимое для реализации типа, является более сложным, содержит другие собственные конструкции или по другим причинам не может быть задано в качестве ключа экземпляра. В таких случаях модель данных построит производный класс IUnknown, поместит данные реализации в этот класс и вызовет метод SetContextForDataModel в экземпляре , чтобы связать данные его реализации с объектом экземпляра. При деструктаже экземпляра число ссылок в классе состояния будет освобождено по мере необходимости.

Синтаксис

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

Параметры

dataModelObject

Объект IModelObject, представляющий модель данных, состояние которой хранится в объекте экземпляра. Это, по сути, хэш-ключ для связанного объекта состояния.

context

Состояние, связанное с экземпляром . Точное значение этого (и любых других интерфейсов и т. д., которые он поддерживает) определяется моделью данных, выполняя вызов для установки этого состояния. Единственное требование заключается в том, что в таком состоянии учитывается ссылка COM.

Возвращаемое значение

Этот метод возвращает HRESULT, который указывает на успех или сбой.

Комментарии

Образец кода

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

Требования

Требование Значение
Заголовок dbgmodel.h

См. также раздел

Интерфейс IModelObject