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


Метод 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 является просто обычным свойством, которое возвращает новый объект, когда вызывающий запрашивает некоторые объекты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

См. также

интерфейс IDataModelManager2