IDataModelManager2::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 时,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!
    }
}

要求

要求
Header dbgmodel.h

另请参阅

IDataModelManager2 接口