Метод 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 |