Método IDataModelManager4::AcquireSubNamespace (dbgmodel.h)
El método AcquireSubNamespace ayuda en la construcción de algo que podría parecerse más tradicionalmente a un espacio de nombres de lenguaje que un nuevo objeto en un lenguaje dinámico. Si, por ejemplo, un autor de la llamada desea clasificar las propiedades en un objeto de proceso para que el objeto de proceso sea más organizado y las propiedades sean más fáciles de detectar, un método de hacerlo sería crear un subobjeto para cada categoría en el objeto de proceso y colocar esas propiedades dentro de ese objeto. El problema con esta noción es que el subobjeto tiene su propio contexto y las propiedades que se pasan al subobjeto como puntero de instancia en lugar del propio objeto de proceso. El método AcquireSubNamespace ayuda a crear una propiedad compartida "subobjeto" donde el puntero de instancia pasado a las propiedades del subobjeto es el objeto primario.
Por ejemplo, considere un objeto de proceso al que queremos agregar una propiedad Heaps que represente el montón de procesos (y todos los demás montones personalizados dentro del proceso). Inicialmente puede aparecer de la siguiente manera:
• Process [foo.exe]
o Heaps [3 heaps]
Dado que el objeto de proceso puede tener muchos otros campos y puede haber muchas cosas asociadas con Memory en el proceso, un mejor paradigma podría ser:
• Process [foo.exe]
o Memory [A namespace of things associated with Memory in the process]
Heaps
Si el objeto Memory anterior es simplemente una propiedad normal que devuelve un nuevo objeto, cuando un autor de la llamada solicita someProcess.Memory.Heaps, el descriptor de acceso de la propiedad Heaps se pasará un objeto de contexto (este puntero) del objeto Memory recién creado sin ninguna manera fácil de volver a otros atributos del proceso. Si el objeto Memory se crea en su lugar con el método AcquireSubNamespace, el paradigma se ve como arriba, excepto que el descriptor de acceso de propiedad para cualquier elemento del objeto Memory será el propio objeto de proceso. Esto permite que la implementación de la propiedad Montóns vuelva fácilmente a otros atributos del proceso. Este estilo de objeto es un subespacio de nombres en lugar de un subobjeto.
Es importante tener en cuenta que no hay nada que el método AcquireSubNamespace haga lo que no se puede lograr con otros métodos. En efecto, se trata de un método auxiliar que hace lo siguiente:
• 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.
Una vez creado un subespacio de nombres, su propiedad se considera compartida entre todos los posibles autores de llamadas del método AcquireSubNamespace con el mismo conjunto de argumentos. Como semántica de propiedad compartida, no es adecuado anular el registro de un subespacio de nombres arbitrariamente.
Sintaxis
HRESULT AcquireSubNamespace(
PCWSTR modelName,
PCWSTR subNamespaceModelName,
PCWSTR accessName,
IKeyStore *metadata,
IModelObject **namespaceModelObject
);
Parámetros
modelName
Nombre del modelo de datos que se va a extender con un subespacio de nombres.
subNamespaceModelName
Nombre del modelo de datos que representa el propio espacio de nombres secundario. El subespacio de nombres recién creado es un modelo de datos que se registrará con este nombre.
accessName
Se agregará una propiedad de este nombre al modelo de datos registrado bajo el nombre proporcionado por el argumento modelName para tener acceso al subespacio de nombres.
metadata
Metadatos opcionales que se van a asociar a la clave dada por accessName en caso de que esta llamada sea la que crea el subespacio de nombres compartido.
namespaceModelObject
El modelo de datos que representa el subespacio de nombres se devolverá aquí. Este modelo de datos puede haber sido creado por una llamada anterior al método AcquireSubNamespace o por la llamada actual. La propiedad se considera compartida entre todos los autores de llamadas.
Valor devuelto
Este método devuelve HRESULT.
Observaciones
de código de ejemplo
ComPtr<IDataModelManager4> 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!
}
}
Requisitos
Requisito | Valor |
---|---|
encabezado de |
dbgmodel.h |
Consulte también