IDataModelManager3::AcquireSubNamespace 方法 (dbgmodel.h)

AcquireSubNamespace 方法有助于构建比动态语言中的新对象更传统的语言命名空间。 例如,如果调用方希望对进程对象的属性进行分类,以使进程对象更加井然有序,并且属性更易于发现,则执行此操作的一种方法是为进程对象上的每个类别创建一个子对象,并将这些属性置于该对象内。 此概念的问题是,子对象有自己的上下文,而子对象的属性作为实例指针传递,而不是进程对象本身。 AcquireSubNamespace 方法有助于创建共享所有权“子对象”,其中传递给子对象的属性的实例指针是父对象。

例如,请考虑一个进程对象,我们要向其添加一个堆属性,该属性表示进程堆(以及进程中的所有其他自定义堆)。 它最初可能如下所示:

    • 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 时,堆属性的属性访问器将传递新创建的 Memory 对象的上下文对象(此指针),且无法轻松返回到进程的其他属性。 如果使用 AcquireSubNamespace 方法创建 Memory 对象,则范例将如上所示,只是内存对象上任何内容的属性访问器将改为进程对象本身。 这允许堆属性实现轻松返回到进程的其他属性。 此对象样式是子命名空间,而不是子对象。

请务必注意,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<IDataModelManager3> 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

另请参阅

IDataModelManager3 接口