IDebugCustomViewer
這個介面可讓表達式評估工具 (EE) 以任何必要格式顯示屬性值。
語法
IDebugCustomViewer : IUknown
實作者的注意事項
EE 會實作這個介面,以自定義格式顯示屬性的值。
呼叫端注意事項
對 COM 函式的 CoCreateInstance
呼叫會具現化這個介面。 傳遞至 CoCreateInstance
的 CLSID
會從登錄取得。 呼叫 GetCustomViewerList 會取得登錄中的位置。 如需詳細數據和範例,請參閱。
依照 Vtable 順序的方法
這個介面會實作下列方法:
方法 | 描述 |
---|---|
DisplayValue | 執行任何顯示指定值的必要動作。 |
備註
當屬性的值無法以一般方式顯示時,會使用此介面,例如,使用數據表或其他複雜屬性類型。 自定義查看器,如 介面所 IDebugCustomViewer
代表,與類型可視化檢視不同,這是用於顯示特定類型之數據的外部程式,不論 EE 為何。 EE 會實作該 EE 特有的自定義查看器。 用戶會選取要使用的可視化檢視類型、類型可視化檢視或自定義查看器。 如需此程式的詳細資訊,請參閱 可視化和檢視數據 。
自定義查看器的註冊方式與 EE 相同,因此需要語言 GUID 和廠商 GUID。 只有 EE 才知道確切的計量(或登錄專案名稱)。 此計量會在 DEBUG_CUSTOM_VIEWER 結構中傳回,而這個計量則會由 GetCustomViewerList 的呼叫傳回。 儲存在計量中的值是 CLSID
傳遞至 COM 函式的 CoCreateInstance
(請參閱範例)。
適用於偵錯的 SDK 協助程式函SetEEMetric
式可用來註冊自定義查看器。 如需自定義查看器需要的特定登錄機碼,請參閱 的 Debugging SDK Helpers
一節。 請注意,自定義查看器只需要一個計量(由 EE 的實作者定義),而表達式評估工具則需要數個預先定義的計量。
一般而言,自定義查看器會提供數據的只讀檢視,因為提供給 DisplayValue 的 IDebugProperty3 介面沒有變更屬性值的方法,但字元串除外。 為了支援變更任意數據區塊,EE 會在實作 介面的相同對象 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);
}