Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Метод 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 является просто обычным свойством, которое возвращает новый объект, когда вызывающий запрашивает некоторые объектыProcess.Memory.Heaps, то метод доступа к свойству Heaps будет передан объект контекста (этот указатель) только что созданного объекта памяти без простого способа вернуться к другим атрибутам процесса. Если объект 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 |