IDebugCustomViewer

此接口允许表达式计算器(企业版)以任何格式显示属性值。

语法

IDebugCustomViewer : IUknown

实现者须知

企业版实现此接口以自定义格式显示属性的值。

对调用者的说明

对 COM 函数的 CoCreateInstance 调用实例化此接口。 CLSID传递给CoCreateInstance的是从注册表获取的。 对 GetCustomViewerList 的调用获取注册表中的位置。 有关详细信息以及示例,请参阅“备注”。

Vtable 顺序中的方法

此接口实现以下方法:

方法 说明
DisplayValue 执行显示给定值所需的任何操作。

备注

当属性的值不能正常显示(例如,使用数据表或其他复杂属性类型)时,将使用此接口。 自定义查看器(由IDebugCustomViewer接口表示)不同于类型可视化工具,它是用于显示特定类型的数据的外部程序,无论企业版如何。 企业版实现特定于该企业版的自定义查看器。 用户选择要使用的可视化工具类型,可以是类型可视化工具或自定义查看器。 有关此过程的详细信息,请参阅 可视化和查看数据

自定义查看器注册的方式与企业版相同,因此需要语言 GUID 和供应商 GUID。 只有企业版才知道确切的指标(或注册表项名称)。 此指标在DEBUG_CUSTOM_VIEWER结构中返回,而该结构又由对 GetCustomViewerList 的调用返回。 存储在指标中的值是 CLSID 传递给 COM 函数 CoCreateInstance 的值(请参阅示例)。

用于调试函数SetEEMetricSDK 帮助程序可用于注册自定义查看器。 有关自定义查看器所需的特定注册表项,请参阅“表达式计算器”注册表部分 Debugging SDK Helpers 。 请注意,自定义查看器只需要一个指标(由企业版实现者定义),而表达式计算器需要几个预定义的指标。

通常,自定义查看器提供数据的只读视图,因为提供给 DisplayValue 的 IDebugProperty3 接口没有更改属性值的方法,只是作为字符串。 为了支持更改任意数据块,企业版在实现接口的同一对象上实现IDebugProperty3自定义接口。 然后,此自定义接口将提供更改任意数据块所需的方法。

要求

标头:msdbg.h

命名空间:Microsoft.VisualStudio.Debugger.Interop

程序集:Microsoft.VisualStudio.Debugger.Interop.dll

示例

此示例演示如何从属性获取第一个自定义查看器(如果该属性具有任何自定义查看器)。

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);
}

另请参阅