IDataModelManager2::AcquireSubNamespace メソッド (dbgmodel.h)
AcquireSubNamespace メソッドは、従来は動的言語の新しいオブジェクトよりも言語名前空間のように見える可能性のあるものを構築するのに役立ちます。 たとえば、呼び出し元がプロセス オブジェクトのプロパティを分類して、プロセス オブジェクトをより整理し、プロパティを検出しやすくしたい場合、これを行う方法の 1 つは、プロセス オブジェクト上のカテゴリごとにサブオブジェクトを作成し、そのオブジェクト内にそれらのプロパティを配置することです。 この概念の問題は、サブオブジェクトに独自のコンテキストがあり、そこに存在するプロパティがプロセス オブジェクト自体の代わりにインスタンス ポインターとして渡されるということです。 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<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 |