다음을 통해 공유


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

참고 항목