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 |