Метод IDataModelManager2::AcquireSubNamespace (dbgmodel.h)
Метод AcquireSubNamespace помогает в построении чего-то, что может более традиционно выглядеть как пространство имен языка, чем новый объект на динамическом языке. Если, например, вызывающий объект хочет классифицировать свойства объекта процесса, чтобы сделать объект процесса более упорядоченным, а свойства проще обнаруживать, один из способов сделать это — создать вложенный объект для каждой категории объекта процесса и поместить эти свойства в этот объект. Проблема с этим понятием заключается в том, что вложенный объект имеет собственный контекст, а свойства передаются в качестве указателя экземпляра, а не самого объекта процесса. Метод AcquireSubNamespace помогает создать под-объект общего владения, где указатель экземпляра, передаваемый свойствам вложенного объекта, является родительским объектом.
В качестве примера рассмотрим объект процесса, в который мы хотим добавить свойство Heaps, представляющее кучу процесса (и все другие пользовательские кучи в рамках процесса). Изначально он может выглядеть следующим образом:
• Process [foo.exe]
o Heaps [3 heaps]
Так как объект процесса может иметь много других полей и может быть много вещей, связанных с памятью в процессе, лучшей парадигмой может быть:
• Process [foo.exe]
o Memory [A namespace of things associated with Memory in the process]
Heaps
Если указанный выше объект Memory является обычным свойством, которое возвращает новый объект, когда вызывающий объект запрашивает someProcess.Memory.Heaps, методу доступа к свойству Heaps будет передан объект контекста (этот указатель) только что созданного объекта Memory без простого способа вернуться к другим атрибутам процесса. Если вместо этого объект Memory создается с помощью метода AcquireSubNamespace, парадигма выглядит так, как описано выше, за исключением того, что методом доступа к свойству для всех объектов в объекте Memory будет сам объект процесса. Это позволяет реализации свойства Heaps легко вернуться к другим атрибутам процесса. Этот стиль объекта является вложенным пространством имен, а не вложенным объектом.
Важно отметить, что метод AcquireSubNamespace не выполняет никаких действий, которые невозможно выполнить с помощью других методов. По сути, это вспомогательный метод, который выполняет следующие действия:
• Checks if there is a model registered under the name given by subNamespaceModelName. If so, returns it. If not, proceeds to:
o Creates and registers a new model under the name given by subNamespaceModelName
o Acquires the model registered under the name given by modelName.
o Adds a new property named according to accessName with metadata supplied by the metadata argument. The accessor for this property returns a new object with special properties:
The new object has the model created and registered under subNamespaceModelName attached as a parent.
The parent model has a context adjustor. The context adjustor is a property.
The context adjustor property getter returns the original process object.
После создания подпространства имен его владение считается общим для всех потенциальных вызовов метода AcquireSubNamespace с тем же набором аргументов. В качестве семантики общего владения отменять произволную регистрацию подпространства имен некорректно.
Синтаксис
HRESULT AcquireSubNamespace(
PCWSTR modelName,
PCWSTR subNamespaceModelName,
PCWSTR accessName,
IKeyStore *metadata,
IModelObject **namespaceModelObject
);
Параметры
modelName
Имя модели данных, которая расширяется с помощью подпространства имен.
subNamespaceModelName
Имя модели данных, представляющей само подпространство имен. Созданное вложенное пространство имен — это модель данных, которая будет зарегистрирована под этим именем.
accessName
Свойство этого имени будет добавлено в модель данных, зарегистрированную под именем, заданным аргументом modelName, чтобы получить доступ к подпространству имен.
metadata
Необязательные метаданные, связанные с ключом, предоставленным accessName в случае, если этот вызов создает общее подпространство имен.
namespaceModelObject
Здесь будет возвращена модель данных, представляющая подпространство имен. Эта модель данных может быть создана путем предварительного вызова метода AcquireSubNamespace или с помощью текущего вызова. Владение считается общим для всех абонентов.
Возвращаемое значение
Этот метод возвращает HRESULT.
Комментарии
Образец кода
ComPtr<IDataModelManager> spManager; /* get the data model manager */
ComPtr<IModelObject> spExtensionModel; /* get a data model you want to extend
some namespace with (see
CreateDataModelObject) */
// Add a shared namespace called "Memory" to Process. Then extend this namespace
// with spExtensionModel
ComPtr<IModelObject> spProcessMemory;
if (SUCCEEDED(spManager->AcquireSubNamespace(
L"Debugger.Models.Process",
L"Debugger.Models.Process.Memory",
L"Memory",
nullptr /* probably should have help metadata! */,
&spProcessMemory)))
{
if (SUCCEEDED(spProcessMemory->AddParentModel(spExtensionModel.Get(),
nullptr,
false)))
{
// The properties on spExtensionModel are now in "Process.Memory.*"
// In addition, the context (*this*) pointer passed to properties on
// spExtensionModel is the process object itself, not some empty
// synthetic created for the namespace!
}
}
Требования
Требование | Значение |
---|---|
Заголовок | dbgmodel.h |