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

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

Интерфейс IDataModelManager2