共用方式為


IDataModelManager2::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 物件上任何專案的屬性存取子會改為進程物件本身。 這可讓堆積屬性實作輕鬆地回到進程的其他屬性。 這個對象的樣式是子命名空間,而不是子物件。

請務必注意,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 介面