共用方式為


IDebugCustomViewer

這個介面可讓表達式評估工具 (EE) 以任何必要格式顯示屬性值。

語法

IDebugCustomViewer : IUknown

實作者的注意事項

EE 會實作這個介面,以自定義格式顯示屬性的值。

呼叫端注意事項

對 COM 函式的 CoCreateInstance 呼叫會具現化這個介面。 傳遞至 CoCreateInstanceCLSID 會從登錄取得。 呼叫 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);
}

另請參閱