Metodo IDataModelManager2::AcquireSubNamespace (dbgmodel.h)
Il metodo AcquireSubNamespace consente di costruire un elemento che potrebbe essere più tradizionalmente simile a uno spazio dei nomi del linguaggio rispetto a un nuovo oggetto in un linguaggio dinamico. Se, ad esempio, un chiamante desidera classificare le proprietà in un oggetto processo per rendere l'oggetto processo più organizzato e le proprietà più facili da individuare, un metodo di questa operazione consiste nel creare un sottooggetto per ogni categoria nell'oggetto processo e posizionare tali proprietà all'interno di tale oggetto. Il problema con questa nozione è che il sottooggetto ha il proprio contesto e le proprietà che vengono passate al sottooggetto come puntatore di istanza anziché all'oggetto processo stesso. Il metodo AcquireSubNamespace consente di creare una proprietà condivisa "sottooggetto" in cui il puntatore dell'istanza passato alle proprietà dell'oggetto secondario è l'oggetto padre.
Si consideri ad esempio un oggetto processo a cui si vuole aggiungere una proprietà Heaps che rappresenta l'heap del processo e tutti gli altri heap personalizzati all'interno del processo. Inizialmente potrebbe apparire come segue:
• Process [foo.exe]
o Heaps [3 heaps]
Poiché l'oggetto processo può avere molti altri campi e potrebbero esserci molti aspetti associati alla memoria nel processo, un paradigma migliore potrebbe essere:
• Process [foo.exe]
o Memory [A namespace of things associated with Memory in the process]
Heaps
Se l'oggetto Memory precedente è semplicemente una proprietà normale che restituisce un nuovo oggetto, quando un chiamante richiede someProcess.Memory.Heaps, la funzione di accesso della proprietà per la proprietà Heaps passerà un oggetto di contesto (questo puntatore) dell'oggetto Memory appena creato senza alcun modo semplice per tornare ad altri attributi del processo. Se l'oggetto Memory viene invece creato con il metodo AcquireSubNamespace, il paradigma è simile al precedente, ad eccezione del fatto che la funzione di accesso della proprietà per qualsiasi elemento nell'oggetto Memory sarà invece l'oggetto processo stesso. Ciò consente all'implementazione della proprietà Heaps di tornare facilmente ad altri attributi del processo. Questo stile di oggetto è uno spazio dei nomi secondario anziché un sottooggetto.
È importante notare che non c'è nulla che il metodo AcquireSubNamespace non può essere eseguito con altri metodi. In effetti, si tratta di un metodo helper che esegue le operazioni seguenti:
• 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.
Dopo aver creato uno spazio dei nomi secondario, la proprietà viene considerata condivisa tra tutti i potenziali chiamanti del metodo AcquireSubNamespace con lo stesso set di argomenti. Come semantica di proprietà condivisa, non è consigliabile annullare la registrazione di uno spazio dei nomi secondario in modo arbitrario.
Sintassi
HRESULT AcquireSubNamespace(
PCWSTR modelName,
PCWSTR subNamespaceModelName,
PCWSTR accessName,
IKeyStore *metadata,
IModelObject **namespaceModelObject
);
Parametri
modelName
Nome del modello di dati che viene esteso con uno spazio dei nomi secondario.
subNamespaceModelName
Nome del modello di dati che rappresenta lo spazio dei nomi secondario stesso. Lo spazio dei nomi secondario appena creato è un modello di dati che verrà registrato con questo nome.
accessName
Una proprietà di questo nome verrà aggiunta al modello di dati registrato con il nome specificato dall'argomento modelName per accedere allo spazio dei nomi secondario.
metadata
Metadati facoltativi da associare alla chiave specificata da accessName nel caso in cui questa chiamata sia quella che crea lo spazio dei nomi secondario condiviso.
namespaceModelObject
Il modello di dati che rappresenta lo spazio dei nomi secondario verrà restituito qui. Questo modello di dati può essere stato creato da una chiamata precedente al metodo AcquireSubNamespace o dalla chiamata corrente. La proprietà viene considerata condivisa tra tutti i chiamanti.
Valore restituito
Questo metodo restituisce HRESULT.
Commenti
Codice di esempio
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!
}
}
Requisiti
Requisito | Valore |
---|---|
Intestazione | dbgmodel.h |