Visualizando e exibindo dados
Os visualizadores de tipo e os visualizadores personalizados apresentam dados de uma forma que é rapidamente significativa para um desenvolvedor. O avaliador de expressão (EE) pode oferecer suporte a visualizadores de tipo de terceiros, bem como fornecer seus próprios visualizadores personalizados.
O Visual Studio determina quantos visualizadores de tipo e visualizadores personalizados estão associados ao tipo do objeto chamando o método GetCustomViewerCount . Se houver pelo menos um visualizador de tipo ou visualizador personalizado disponível, o Visual Studio chama o método GetCustomViewerList para recuperar uma lista desses visualizadores e visualizadores (na verdade, uma lista de s que implementa os visualizadores e visualizadores) e os apresenta ao usuário.
Suporte a visualizadores de tipo
Há uma série de interfaces que o EE deve implementar para oferecer suporte a visualizadores de tipo. Essas interfaces podem ser divididas em duas grandes categorias: interfaces que listam os visualizadores de tipo e interfaces que acessam os dados da propriedade.
Visualizadores de tipo de listagem
O EE suporta a listagem dos visualizadores de tipo em sua implementação de IDebugProperty3::GetCustomViewerCount
e IDebugProperty3::GetCustomViewerList
. Esses métodos passam a chamada para os métodos correspondentes GetCustomViewerCount e GetCustomViewerList.
O IEEVisualizerService é obtido chamando CreateVisualizerService. Esse método requer a interface IDebugBinder3 , que é obtida da interface IDebugBinder passada para EvaluateSync. IEEVisualizerServiceProvider::CreateVisualizerService
também requer as interfaces IDebugSymbolProvider e IDebugAddress , que foram passadas para IDebugParsedExpression::EvaluateSync
. A interface final necessária para criar a interface é a IEEVisualizerService
interface IEEVisualizerDataProvider , que o EE implementa. Essa interface permite que alterações sejam feitas na propriedade que está sendo visualizada. Todos os dados de propriedade são encapsulados em uma interface IDebugObject , que também é implementada pelo EE.
Acessando dados de propriedade
O acesso aos dados da propriedade é feito por meio da interface IPropertyProxyEESide. Para obter essa interface, o Visual Studio chama QueryInterface no objeto de propriedade para obter a interface IPropertyProxyProvider (implementada no mesmo objeto que implementa a interface IDebugProperty3) e, em seguida, chama o método GetPropertyProxy para obter a IPropertyProxyEESide
interface.
Todos os dados passados para dentro e para fora da IPropertyProxyEESide
interface são encapsulados na interface IEEDataStorage . Essa interface representa uma matriz de bytes e é implementada pelo Visual Studio e pelo EE. Quando os dados de uma propriedade devem ser alterados, o Visual Studio cria um objeto que contém os novos dados e chama CreateReplacementObject com esse objeto de dados para obter um IEEDataStorage
novo IEEDataStorage
objeto que, por sua vez, é passado para InPlaceUpdateObject para atualizar os dados da propriedade. IPropertyProxyEESide::CreateReplacementObject
permite que o EE instancie sua própria classe que implementa a IEEDataStorage
interface.
Suporte a visualizadores personalizados
O sinalizador DBG_ATTRIB_VALUE_CUSTOM_VIEWER
é definido no dwAttrib
campo da estrutura DEBUG_PROPERTY_INFO (retornado por uma chamada para GetPropertyInfo) para indicar que o objeto tem um visualizador personalizado associado a ele. Quando esse sinalizador é definido, o Visual Studio obtém a interface IDebugProperty3 da interface IDebugProperty2 usando QueryInterface.
Se o usuário seleciona um visualizador personalizado, o Visual Studio instancia o visualizador personalizado usando o visualizador CLSID
fornecido pelo IDebugProperty3::GetCustomViewerList
método. Em seguida, o Visual Studio chama DisplayValue para mostrar o valor ao usuário.
Normalmente, IDebugCustomViewer::DisplayValue
apresenta uma exibição somente leitura dos dados. Para permitir alterações nos dados, o EE deve implementar uma interface personalizada que ofereça suporte à alteração de dados em um objeto de propriedade. O IDebugCustomViewer::DisplayValue
método usa essa interface personalizada para oferecer suporte à alteração dos dados. O método procura a interface personalizada na IDebugProperty2
interface passada como o pDebugProperty
argumento.
Suporte a visualizadores de tipo e visualizadores personalizados
Um EE pode oferecer suporte a visualizadores de tipo e visualizadores personalizados nos métodos GetCustomViewerCount e GetCustomViewerList . Primeiro, o EE adiciona o número de visualizadores personalizados que ele está fornecendo ao valor retornado pelo GetCustomViewerCount método. Em segundo lugar, o EE acrescenta o CLSID
s de seus próprios visualizadores personalizados à lista retornada pelo método GetCustomViewerList .