Método IDataModelManager2::RegisterModelForTypeSignature (dbgmodel.h)
O método RegisterModelForTypeSignature é o método primário que um chamador utiliza para registrar um visualizador canônico para um determinado tipo (ou conjunto de tipos). Um visualizador canônico é um modelo de dados que, na verdade, assume a exibição de um determinado tipo (ou conjunto de tipos). Em vez da exibição nativa/de idioma do tipo que está sendo exibido em qualquer interface do usuário do depurador, a exibição do tipo conforme apresentado pelo modelo de dados registrado é exibida (juntamente com um meio de voltar à exibição nativa/de idioma para um usuário que o deseja). A assinatura de tipo passada para esse método pode corresponder a vários tipos concretos. Se houver várias correspondências para uma determinada instância de tipo, somente a melhor correspondência será retornada. Uma assinatura de tipo será considerada uma correspondência melhor do que outra se ela se referir mais especificamente a um determinado tipo concreto. Como exemplos:
A) std::pair<*, *>
B) std::pair<int, *>
C) std::pair<int, float>
Se as três assinaturas de tipo acima (A, B e C) forem registradas e verificadas em um tipo concreto:
std::pair<int, float>
As assinaturas alltype correspondem a essa instância de tipo. O segundo é uma correspondência melhor do que a primeira porque int (o primeiro argumento de modelo de B) é uma correspondência melhor do que um curinga (o primeiro argumento de modelo de A). Da mesma forma, o terceiro é uma correspondência melhor do que a segunda (é uma correspondência total sem curingas). O método RegisterModelForTypeSignature não permitirá que assinaturas de tipo duplicadas sejam registradas. Somente um modelo de dados pode ser registrado como visualizador canônico para uma determinada assinatura de tipo. Uma tentativa de registrar a mesma assinatura de tipo duas vezes falhará. Da mesma forma, o método RegisterModelForTypeSignature não permitirá que assinaturas de tipo que possam corresponder ambíguas a qualquer instância de tipo sejam registradas. Por exemplo:
D) std::pair<int, *>
E) std::pair<*, int>
As duas assinaturas de tipo acima (D e E) não podem ser registradas. Para alguns tipos, fica claro qual assinatura se aplica e é melhor. Por exemplo,
std::pair<int, float>
Corresponde apenas ao primeiro desses (D), pois float e int não correspondem. No entanto, é completamente ambíguo ao considerar o seguinte:
std::pair<int, int>
Qualquer uma dessas assinaturas é igualmente boa (ambas têm uma correspondência de concreto e um curinga). Essas assinaturas de tipo são ambíguas. Portanto, uma chamada para registrar o segundo deles falhará por esse motivo.
Sintaxe
HRESULT RegisterModelForTypeSignature(
IDebugHostTypeSignature *typeSignature,
IModelObject *dataModel
);
Parâmetros
typeSignature
A assinatura de tipo que está sendo registrada. Qualquer objeto nativo/de linguagem de um tipo concreto que melhor corresponda a essa assinatura de tipo terá o modelo de dados fornecido pelo argumento dataModel anexado automaticamente.
dataModel
O modelo de dados que deve se tornar o visualizador canônico para tipos que correspondem à assinatura de tipo fornecida.
Retornar valor
Esse método retorna HRESULT que indica êxito ou falha. Esse método não registrará assinaturas de tipo idênticas ou ambíguas.
Comentários
Código de exemplo
ComPtr<IDataModelManager2> spManager; /* get the data model manager */
ComPtr<IDebugHost> spHost; /* get the debug host */
ComPtr<IModelObject> spDataModel; /* create a data model (see
CreateDataModelObject) */
ComPtr<IDebugHostSymbols> spSym;
if (SUCCEEDED(spHost.As(&spSym)))
{
// Create a signature to match MyType<*>
ComPtr<IDebugHostTypeSignature> spTypeSignature;
if (SUCCEEDED(spSym->CreateTypeSignature(L"MyType<*>",
nullptr,
&spTypeSignature)))
{
// Register the model for std::vector<*>
if (SUCCEEDED(spManager->RegisterModelForTypeSignature(spTypeSignature.Get(),
spDataModel.Get()))
{
// Every instance matching MyType<*> will now have spDataModel
// attached as the parent. Further, such parent is considered
// the canonical visualizer for all types matching MyType<*> since
// it was registered via RegisterModelForTypeSignature instead of
// RegisterExtensionForTypeSignature.
}
}
}
Requisitos
Requisito | Valor |
---|---|
Cabeçalho | dbgmodel.h |