Método IDataModelManager2::AcquireSubNamespace (dbgmodel.h)
O método AcquireSubNamespace ajuda na construção de algo que pode ser mais tradicionalmente parecido com um namespace de linguagem do que um novo objeto em uma linguagem dinâmica. Se, por exemplo, um chamador quiser categorizar propriedades em um objeto de processo para tornar o objeto de processo mais organizado e as propriedades mais fáceis de descobrir, um método de fazer isso seria criar um subpropriedade para cada categoria no objeto de processo e colocar essas propriedades dentro desse objeto. O problema com essa noção é que o subpropriedade tem seu próprio contexto e as propriedades lá são passadas pelo subpropriedade como um ponteiro de instância em vez do próprio objeto de processo. O método AcquireSubNamespace ajuda a criar uma propriedade compartilhada "sub-objeto" em que o ponteiro de instância passado para propriedades do subpropriedade é o objeto pai.
Por exemplo, considere um objeto de processo ao qual queremos adicionar uma propriedade Heaps que representa o heap de processo (e todos os outros heaps personalizados dentro do processo). Inicialmente, ele pode aparecer da seguinte maneira:
• Process [foo.exe]
o Heaps [3 heaps]
Como o objeto de processo pode ter muitos outros campos e pode haver muitas coisas associadas à Memória no processo, um paradigma melhor pode ser:
• Process [foo.exe]
o Memory [A namespace of things associated with Memory in the process]
Heaps
Se o objeto Memory acima for simplesmente uma propriedade normal que retorna um novo objeto, quando um chamador solicitar someProcess.Memory.Heaps, o acessador de propriedade para a propriedade Heaps será passado um objeto de contexto (este ponteiro) do objeto Memory recém-criado sem uma maneira fácil de voltar para outros atributos do processo. Se o objeto Memory for criado com o método AcquireSubNamespace, o paradigma terá a aparência acima, exceto que o acessador de propriedade para qualquer coisa no objeto Memory será, em vez disso, o próprio objeto de processo. Isso permite que a implementação da propriedade Heaps volte facilmente para outros atributos do processo. Esse estilo de objeto é um subpasta em vez de um subpropósitório.
É importante observar que não há nada que o método AcquireSubNamespace faça que não possa ser realizado com outros métodos. Na verdade, esse é um método auxiliar que faz o seguinte:
• 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.
Depois que um sub-namespace é criado, sua propriedade é considerada compartilhada entre todos os potenciais chamadores do método AcquireSubNamespace com o mesmo conjunto de argumentos. Como uma semântica de propriedade compartilhada, é impróprio cancelar o registro de um subpasta arbitrariamente.
Sintaxe
HRESULT AcquireSubNamespace(
PCWSTR modelName,
PCWSTR subNamespaceModelName,
PCWSTR accessName,
IKeyStore *metadata,
IModelObject **namespaceModelObject
);
Parâmetros
modelName
O nome do modelo de dados que está sendo estendido com um subpasta.
subNamespaceModelName
O nome do modelo de dados que representa o sub-namespace em si. O subpaspa recém-criado é um modelo de dados que será registrado com esse nome.
accessName
Uma propriedade desse nome será adicionada ao modelo de dados registrado sob o nome fornecido pelo argumento modelName para acessar o subpasta.
metadata
Metadados opcionais a serem associados à chave fornecida pelo accessName no caso de essa chamada ser aquela que cria o sub-namespace compartilhado.
namespaceModelObject
O modelo de dados que representa o subpasta será retornado aqui. Esse modelo de dados pode ter sido criado por uma chamada anterior ao método AcquireSubNamespace ou pela chamada atual. A propriedade é considerada compartilhada entre todos os chamadores.
Retornar valor
Esse método retorna HRESULT.
Comentários
Código de exemplo
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!
}
}
Requisitos
Requisito | Valor |
---|---|
Cabeçalho | dbgmodel.h |