Freigeben über


IDataModelManager2::AcquireSubNamespace-Methode (dbgmodel.h)

Die AcquireSubNamespace-Methode hilft bei der Erstellung von Etwas, das eher wie ein Sprachnamespace aussieht als ein neues Objekt in einer dynamischen Sprache. Wenn ein Aufrufer für instance Eigenschaften für ein Prozessobjekt kategorisieren möchte, um das Prozessobjekt besser zu organisieren und die Eigenschaften einfacher zu erkennen, wäre eine Methode dazu, ein Unterobjekt für jede Kategorie im Prozessobjekt zu erstellen und diese Eigenschaften innerhalb dieses Objekts zu platzieren. Das Problem bei diesem Begriff besteht darin, dass das Unterobjekt über einen eigenen Kontext verfügt und die Eigenschaften dort das Unterobjekt als instance-Zeiger anstelle des Prozessobjekts selbst übergeben werden. Die AcquireSubNamespace-Methode hilft beim Erstellen eines gemeinsam genutzten "Unterobjekts", wobei der an Eigenschaften des Unterobjekts übergebene instance Zeiger das übergeordnete Objekt ist.

Betrachten Sie als Beispiel ein Prozessobjekt, dem wir eine Heaps-Eigenschaft hinzufügen möchten, die den Prozessheap (und alle anderen benutzerdefinierten Heaps innerhalb des Prozesses) darstellt. Es kann zunächst wie folgt aussehen:

    • Process [foo.exe] 
        o Heaps [3 heaps]

Da das Prozessobjekt viele andere Felder haben kann und es viele Dinge gibt, die dem Speicher im Prozess zugeordnet 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, wird der Eigenschaftsaccessor für die Heaps-Eigenschaft ein Kontextobjekt (dieser Zeiger) des neu erstellten Memory-Objekts übergeben, wenn ein Aufrufer nach someProcess.Memory.Heaps fragt. 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 Implementierung der Heaps-Eigenschaft problemlos zu anderen Attributen des Prozesses zurückkehren. Dieser Objektstil ist ein Unternamespace anstelle eines Unterobjekts.

Es ist wichtig zu beachten, dass die AcquireSubNamespace-Methode nichts ausführt, was mit anderen Methoden nicht erreicht werden kann. Tatsächlich handelt es sich dabei um 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.

Sobald ein Unternamespace erstellt wurde, wird der Besitz von allen potenziellen Aufrufenden der AcquireSubNamespace-Methode mit demselben Satz von Argumenten als freigegeben betrachtet. Als Semantik des gemeinsamen Besitzes ist es unzulässig, die Registrierung eines Unternamespace 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 registriert ist, der vom Argument modelName angegeben wird, um auf den Unternamespace zuzugreifen.

metadata

Optionale Metadaten, die dem schlüssel zugeordnet werden sollen, der von accessName angegeben wird, falls dieser Aufruf derjenige 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 von allen Anrufern gemeinsam betrachtet.

Rückgabewert

Diese Methode gibt HRESULT zurück.

Hinweise

Beispielcode

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!
    }
}

Anforderungen

Anforderung Wert
Header dbgmodel.h

Weitere Informationen

IDataModelManager2-Schnittstelle