IDataModelManager3::AcquireSubNamespace-Methode (dbgmodel.h)
Die AcquireSubNamespace-Methode hilft beim Erstellen eines Elements, das herkömmlicher als ein Sprachnamespace aussieht als ein neues Objekt in einer dynamischen Sprache. Wenn beispielsweise ein Aufrufer Eigenschaften für ein Prozessobjekt kategorisieren möchte, damit das Prozessobjekt besser organisiert wird und die Eigenschaften leichter zu erkennen sind, besteht eine Methode darin, ein Unterobjekt für jede Kategorie für das Prozessobjekt zu erstellen und diese Eigenschaften innerhalb dieses Objekts zu platzieren. Das Problem mit diesem Begriff besteht darin, dass das Unterobjekt über einen eigenen Kontext verfügt und die Eigenschaften, die es gibt, das Unterobjekt als Instanzzeiger anstelle des Prozessobjekts selbst übergeben werden. Die AcquireSubNamespace-Methode hilft, ein freigegebenes Besitzobjekt zu erstellen, bei dem der Instanzzeiger, der an Eigenschaften des Unterobjekts übergeben wurde, das übergeordnete Objekt ist.
Betrachten Sie beispielsweise ein Prozessobjekt, dem wir eine Heaps-Eigenschaft hinzufügen möchten, die den Prozess heap darstellt (und alle anderen benutzerdefinierten Heaps innerhalb des Prozesses). Es kann zunächst wie folgt angezeigt werden:
• Process [foo.exe]
o Heaps [3 heaps]
Da das Prozessobjekt möglicherweise viele andere Felder hat und viele Dinge mit dem Speicher im Prozess verbunden sind, könnte ein besseres Paradigma sein:
• Process [foo.exe]
o Memory [A namespace of things associated with Memory in the process]
- Heaps
Wenn das obige Memory-Objekt einfach eine normale Eigenschaft ist, die ein neues Objekt zurückgibt, wenn ein Aufrufer nach someProcess.Memory.Heaps fragt, wird der Eigenschaftenaccessor für die Heaps-Eigenschaft ein Kontextobjekt (dieser Zeiger) des neu erstellten Memory-Objekts ohne einfache Möglichkeit übergeben, um zu anderen Attributen des Prozesses zurückzukehren. Wenn das Memory-Objekt stattdessen mit der AcquireSubNamespace-Methode erstellt wird, sieht das Paradigma wie oben aus, mit der Ausnahme, dass der Eigenschaftsaccessor für alles im Memory-Objekt stattdessen das Prozessobjekt selbst ist. Dadurch kann die Heaps-Eigenschaftsimplementierung problemlos zu anderen Attributen des Prozesses zurückkehren. Diese Objektart ist ein Unternamespace anstelle eines Unterobjekts.
Es ist wichtig zu beachten, dass es nichts gibt, was die AcquireSubNamespace-Methode tut, die nicht mit anderen Methoden erreicht werden kann. Dies ist in Der Tat eine Hilfsmethode, die Folgendes ausführt:
• 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.
Nachdem ein Unternamespace erstellt wurde, wird sein Besitz für alle potenziellen Aufrufer der AcquireSubNamespace-Methode mit demselben Satz von Argumenten verwendet. Als Semantik des gemeinsamen Besitzes ist es nicht ordnungsgemäß, die Registrierung eines Unternamespaces willkürlich aufzuheben.
Syntax
HRESULT AcquireSubNamespace(
PCWSTR modelName,
PCWSTR subNamespaceModelName,
PCWSTR accessName,
IKeyStore *metadata,
IModelObject **namespaceModelObject
);
Parameter
modelName
Der Name des Datenmodells, das mit einem Unternamespace erweitert wird.
subNamespaceModelName
Der Name des Datenmodells, das den Unternamespace selbst darstellt. Der neu erstellte Unternamespace ist ein Datenmodell, das unter diesem Namen registriert wird.
accessName
Eine Eigenschaft dieses Namens wird dem Datenmodell hinzugefügt, das unter dem namen des ModelName-Arguments registriert ist, um auf den Unternamespace zuzugreifen.
metadata
Optionale Metadaten, die dem von accessName zugewiesenen Schlüssel zugeordnet werden sollen, wenn dieser Aufruf der einzige ist, der den freigegebenen Unternamespace erstellt.
namespaceModelObject
Das Datenmodell, das den Unternamespace darstellt, wird hier zurückgegeben. Dieses Datenmodell wurde möglicherweise durch einen vorherigen Aufruf der AcquireSubNamespace-Methode oder durch den aktuellen Aufruf erstellt. Der Besitz wird als unter allen Anrufern geteilt.
Rückgabewert
Diese Methode gibt HRESULT zurück.
Bemerkungen
Beispielcode-
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!
}
}
Anforderungen
Anforderung | Wert |
---|---|
Header- | dbgmodel.h |