IDebugCustomViewer

Esta interfaz permite que un evaluador de expresiones (EE) muestre el valor de una propiedad en cualquier formato necesario.

Sintaxis

IDebugCustomViewer : IUknown

Notas para los implementadores

Un EE implementa esta interfaz para mostrar el valor de una propiedad en un formato personalizado.

Notas para autores de la llamada

Una llamada a la función com crea una instancia de CoCreateInstance esta interfaz. El CLSID objeto pasado a CoCreateInstance se obtiene del Registro. Una llamada a GetCustomViewerList obtiene la ubicación en el Registro. Vea Comentarios para obtener más información, así como el ejemplo.

Métodos en orden de Vtable

Esta interfaz implementa el método siguiente:

Method Descripción
DisplayValue Hace lo necesario para mostrar un valor determinado.

Comentarios

Esta interfaz se usa cuando el valor de una propiedad no se puede mostrar por medios normales, por ejemplo, con una tabla de datos u otro tipo de propiedad compleja. Un visor personalizado, representado por la IDebugCustomViewer interfaz, es diferente de un visualizador de tipos, que es un programa externo para mostrar datos de un tipo específico independientemente de ee. Ee implementa un visor personalizado que es específico de ese EE. Un usuario selecciona el tipo de visualizador que se va a usar, ya sea un visualizador de tipo o un visor personalizado. Consulte Visualización y visualización de datos para obtener más información sobre este proceso.

Un visor personalizado se registra de la misma manera que ee y, por lo tanto, requiere un GUID de lenguaje y un GUID de proveedor. La métrica exacta (o el nombre de la entrada del Registro) solo se conoce para ee. Esta métrica se devuelve en la estructura DEBUG_CUSTOM_VIEWER , que a su vez se devuelve mediante una llamada a GetCustomViewerList. El valor almacenado en la métrica es el CLSID que se pasa a la función com CoCreateInstance (vea el ejemplo).

Los asistentes del SDK para la función de depuración , SetEEMetric, se pueden usar para registrar un visor personalizado. Consulte la sección del Registro "Evaluadores de expresiones" de Debugging SDK Helpers para conocer las claves del Registro específicas que necesita un visor personalizado. Tenga en cuenta que un visor personalizado solo necesita una métrica (definida por el implementador de EE), mientras que un evaluador de expresiones requiere varias métricas predefinidas.

Normalmente, un visor personalizado proporciona una vista de solo lectura de los datos, ya que la interfaz IDebugProperty3 proporcionada a DisplayValue no tiene métodos para cambiar el valor de la propiedad, excepto como una cadena. Para admitir el cambio de bloques arbitrarios de datos, EE implementa una interfaz personalizada en el mismo objeto que implementa la IDebugProperty3 interfaz. A continuación, esta interfaz personalizada proporcionaría los métodos necesarios para cambiar un bloque arbitrario de datos.

Requisitos

Encabezado: msdbg.h

Espacio de nombres: Microsoft.VisualStudio.Debugger.Interop

Ensamblado: Microsoft.VisualStudio.Debugger.Interop.dll

Ejemplo

En este ejemplo se muestra cómo obtener el primer visor personalizado de una propiedad si esa propiedad tiene visores 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);
}

Consulte también