类型可视化工具和自定义查看器以对开发人员快速有意义的方式呈现数据。 表达式计算器(EE)可以支持第三方类型可视化工具,并提供自己的自定义查看器。
Visual Studio 通过调用 GetCustomViewerCount 方法来确定与对象类型关联的类型可视化工具和自定义查看器数。 如果至少有一个类型可视化工具或自定义查看器可用,Visual Studio 将调用 GetCustomViewerList 方法来检索这些可视化工具和查看器的列表(实际上,实现可视化工具和查看器的列表)并将其呈现给用户。
支持类型可视化工具
EE 必须实现许多接口来支持类型可视化工具。 这些接口可以分为两大类:列出类型可视化工具的接口和访问属性数据的接口。
列出所有类型可视化工具
EE 支持在其 IDebugProperty3::GetCustomViewerCount 和 IDebugProperty3::GetCustomViewerList 的实现中列出类型可视化工具。 这些方法将调用传递给相应的方法 GetCustomViewerCount 和 GetCustomViewerList。
IEEVisualizerService 通过调用 CreateVisualizerService 获取。 此方法需要 IDebugBinder3 接口,该接口是从传递给 EvaluateSync 的 IDebugBinder 接口获取的。
IEEVisualizerServiceProvider::CreateVisualizerService还需要IDebugSymbolProvider和IDebugAddress接口,这些接口已经传递给IDebugParsedExpression::EvaluateSync。 创建 IEEVisualizerService 接口所需的最后一个接口是 EE 实现的 IEEVisualizerDataProvider 接口。 此接口允许对要可视化的属性进行更改。 所有属性数据都封装在 IDebugObject 接口中,该接口也由 EE 实现。
访问属性数据
通过 IPropertyProxyEESide 接口访问属性数据。 为了获取此接口,Visual Studio 对属性对象调用 QueryInterface 以获取 IPropertyProxyProvider 接口(在实现 IDebugProperty3 接口的同一对象上实现),然后调用 GetPropertyProxy 方法获取 IPropertyProxyEESide 接口。
传入和传出 IPropertyProxyEESide 接口的所有数据都封装在 IEEDataStorage 接口中。 此接口表示字节数组,并由 Visual Studio 和 EE 实现。 当属性的数据要更改时,Visual Studio 会创建一个 IEEDataStorage 保存新数据的对象,并使用该数据对象调用 CreateReplacementObject ,以便获取一个新 IEEDataStorage 对象,而该对象又传递给 InPlaceUpdateObject 以更新该属性的数据。
IPropertyProxyEESide::CreateReplacementObject 允许 EE 实例化它自己的实现 IEEDataStorage 接口的类。
支持自定义查看器
标志DBG_ATTRIB_VALUE_CUSTOM_VIEWER在dwAttribDEBUG_PROPERTY_INFO结构的字段中设置(由对 GetPropertyInfo 的调用返回),以指示该对象具有与之关联的自定义查看器。 设置此标志后,Visual Studio 将使用 QueryInterface 从 IDebugProperty2 接口获取 IDebugProperty3 接口。
如果用户选择自定义查看器,Visual Studio 将通过IDebugProperty3::GetCustomViewerList方法提供的CLSID来实例化自定义查看器。 然后,Visual Studio 调用 DisplayValue 向用户显示值。
通常, IDebugCustomViewer::DisplayValue 提供数据的只读视图。 若要允许对数据进行更改,EE 必须实现支持更改属性对象上的数据的自定义接口。 该方法 IDebugCustomViewer::DisplayValue 使用此自定义接口来支持更改数据。 该方法查找作为参数传入的IDebugProperty2接口上的pDebugProperty自定义接口。
支持类型可视化工具和自定义查看器
EE 可以在 GetCustomViewerCount 和 GetCustomViewerList 方法中同时支持类型可视化器和自定义查看器。 首先,EE 将其提供的自定义查看器数量加到 GetCustomViewerCount 方法返回的值上。 其次,EE 将其自定义查看器的CLSID实例追加到GetCustomViewerList方法返回的列表中。