共用方式為


IDataModelManager3::AcquireSubNamespace 方法 (dbgmodel.h)

AcquireSubNamespace 方法有助於建構比動態語言中新物件更傳統的語言命名空間。 例如,如果呼叫端想要將進程物件上的屬性分類,讓進程物件更容易組織,而且屬性更容易探索,則執行此動作的其中一種方法就是為進程物件上的每個類別建立子物件,並將這些屬性放在該物件內。 這個概念的問題在於子物件有自己的內容,而有的屬性會傳遞子物件做為實例指標,而不是進程物件本身。 AcquireSubNamespace 方法有助於建立共用擁有權 “sub-object”,其中傳遞至子對象的屬性的實例指標是父物件。

例如,假設有一個進程對象,我們想要在其中加入代表進程堆積的 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 對象的內容物件(此指標),而無法輕易地回到進程的其他屬性。 如果以 AcquireSubNamespace 方法建立 Memory 物件,則範例會如上所示,不同之處在於 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<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 介面