IDebugCustomViewer
此接口允许表达式计算器(企业版)以任何格式显示属性值。
语法
IDebugCustomViewer : IUknown
实现者须知
企业版实现此接口以自定义格式显示属性的值。
对调用者的说明
对 COM 函数的 CoCreateInstance
调用实例化此接口。 CLSID
传递给CoCreateInstance
的是从注册表获取的。 对 GetCustomViewerList 的调用获取注册表中的位置。 有关详细信息以及示例,请参阅“备注”。
Vtable 顺序中的方法
此接口实现以下方法:
方法 | 说明 |
---|---|
DisplayValue | 执行显示给定值所需的任何操作。 |
备注
当属性的值不能正常显示(例如,使用数据表或其他复杂属性类型)时,将使用此接口。 自定义查看器(由IDebugCustomViewer
接口表示)不同于类型可视化工具,它是用于显示特定类型的数据的外部程序,无论企业版如何。 企业版实现特定于该企业版的自定义查看器。 用户选择要使用的可视化工具类型,可以是类型可视化工具或自定义查看器。 有关此过程的详细信息,请参阅 可视化和查看数据 。
自定义查看器注册的方式与企业版相同,因此需要语言 GUID 和供应商 GUID。 只有企业版才知道确切的指标(或注册表项名称)。 此指标在DEBUG_CUSTOM_VIEWER结构中返回,而该结构又由对 GetCustomViewerList 的调用返回。 存储在指标中的值是 CLSID
传递给 COM 函数 CoCreateInstance
的值(请参阅示例)。
用于调试函数SetEEMetric
的 SDK 帮助程序可用于注册自定义查看器。 有关自定义查看器所需的特定注册表项,请参阅“表达式计算器”注册表部分 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);
}