IDebugCustomViewer

Essa interface permite que um avaliador de expressão (EE) exiba o valor de uma propriedade em qualquer formato necessário.

Sintaxe

IDebugCustomViewer : IUknown

Notas para implementadores

Um EE implementa essa interface para exibir o valor de uma propriedade em um formato personalizado.

Observações para chamadores

Uma chamada para a função COM CoCreateInstance instancia essa interface. O CLSID passado para CoCreateInstance é obtido a partir do registro. Uma chamada para GetCustomViewerList obtém o local no registro. Consulte Comentários para obter detalhes, bem como o Exemplo.

Métodos na ordem VTable

Essa interface implementa o seguinte método:

Método Descrição
DisplayValue Faz o que for necessário para exibir um determinado valor.

Comentários

Essa interface é usada quando o valor de uma propriedade não pode ser exibido por meios normais — por exemplo, com uma tabela de dados ou outro tipo de propriedade complexa. Um visualizador personalizado, como representado pela IDebugCustomViewer interface, é diferente de um visualizador de tipo, que é um programa externo para exibir dados de um tipo específico, independentemente do EE. O EE implementa um visualizador personalizado que é específico para esse EE. Um usuário seleciona qual tipo de visualizador usar, seja um visualizador de tipo ou um visualizador personalizado. Consulte Visualizando e exibindo dados para obter detalhes sobre esse processo.

Um visualizador personalizado é registrado da mesma forma que um EE e, portanto, requer um GUID de idioma e um GUID de fornecedor. A métrica exata (ou nome de entrada do registro) é conhecida apenas pelo EE. Essa métrica é retornada na estrutura DEBUG_CUSTOM_VIEWER, que por sua vez é retornada por uma chamada para GetCustomViewerList. O valor armazenado na métrica é o que é passado para a função COM CoCreateInstance (consulte o CLSID Exemplo).

A função SDK Helpers for Debugging , SetEEMetric, pode ser usada para registrar um visualizador personalizado. Consulte a seção do Registro "Avaliadores de expressão" para obter as chaves do Registro específicas de Debugging SDK Helpers que um visualizador personalizado precisa. Observe que um visualizador personalizado precisa de apenas uma métrica (que é definida pelo implementador do EE), enquanto um avaliador de expressão requer várias métricas predefinidas.

Normalmente, um visualizador personalizado fornece uma exibição somente leitura dos dados, já que a interface IDebugProperty3 fornecida a DisplayValue não tem métodos para alterar o valor da propriedade, exceto como uma cadeia de caracteres. Para dar suporte à alteração de blocos arbitrários de dados, o EE implementa uma interface personalizada no mesmo objeto que implementa a IDebugProperty3 interface. Essa interface personalizada forneceria os métodos necessários para alterar um bloco arbitrário de dados.

Requisitos

Cabeçalho: msdbg.h

Espaço para nome: Microsoft.VisualStudio.Debugger.Interop

Assembly: Microsoft.VisualStudio.Debugger.Interop.dll

Exemplo

Este exemplo mostra como obter o primeiro visualizador personalizado de uma propriedade se essa propriedade tiver visualizadores personalizados.

IDebugCustomViewer *GetFirstCustomViewer(IDebugProperty2 *pProperty)
{
    // This string is typically defined globally.  For this example, it
    // is defined here.
    static const WCHAR strRegistrationRoot[] = L"Software\\Microsoft\\VisualStudio\\8.0Exp";
    IDebugCustomViewer *pViewer = NULL;
    if (pProperty != NULL) {
        CComQIPtr<IDebugProperty3> pProperty3(pProperty);
        if (pProperty3 != NULL) {
            HRESULT hr;
            ULONG viewerCount = 0;
            hr = pProperty3->GetCustomViewerCount(&viewerCount);
            if (viewerCount > 0) {
                ULONG viewersFetched = 0;
                DEBUG_CUSTOM_VIEWER viewerInfo = { 0 };
                hr = pProperty3->GetCustomViewerList(0,
                                                     1,
                                                     &viewerInfo,
                                                     &viewersFetched);
                if (viewersFetched == 1) {
                    CLSID clsidViewer = { 0 };
                    CComPtr<IDebugCustomViewer> spCustomViewer;
                    // Get the viewer's CLSID from the registry.
                    ::GetEEMetric(viewerInfo.guidLang,
                                  viewerInfo.guidVendor,
                                  viewerInfo.bstrMetric,
                                  &clsidViewer,
                                  strRegistrationRoot);
                    if (!IsEqualGUID(clsidViewer,GUID_NULL)) {
                        // Instantiate the custom viewer.
                        spCustomViewer.CoCreateInstance(clsidViewer);
                        if (spCustomViewer != NULL) {
                            pViewer = spCustomViewer.Detach();
                        }
                    }
                }
            }
        }
    }
    return(pViewer);
}

Confira também