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 IEEVisualizerServiceinterface 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 IPropertyProxyEESideinterface.

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 CLSIDs de seus próprios visualizadores personalizados à lista retornada pelo método GetCustomViewerList .