다음을 통해 공유


디버거 데이터 모델 C++ 추가 인터페이스

이 항목에서는 메타데이터, 개념 및 개체 열거와 같은 디버거 C++ 데이터 모델과 관련된 몇 가지 추가 인터페이스에 대해 설명합니다.

디버거 데이터 모델 메타데이터 인터페이스

데이터 모델의 핵심 개념 중 하나는 개체(특히 합성 개체)가 키/값/메타데이터 튜플의 사전이라는 것입니다. 각 키에는 키와 해당 잠재적 값을 둘러싼 다양한 항목을 설명하는 메타데이터의 전체 저장소가 연결될 수 있습니다. 메타데이터는 어떤 방식으로든 키 값을 변경하지 않습니다. 키 및 해당 값과 관련된 보조 정보만 표시 또는 키 및 해당 값의 다른 관련 특성에 영향을 줄 수 있습니다.

어떤 의미에서 메타데이터 저장소는 데이터 모델에서 개체의 본질인 키/값/메타데이터 튜플과 다르지 않습니다. 그러나 이 보기에서 간소화되었습니다. 메타데이터 저장소는 IKeyStore 인터페이스로 표시됩니다. 키/값/메타데이터 튜플의 컬렉션이기도 하지만 메타데이터 키 저장소와 모델 개체를 사용하여 수행할 수 있는 작업은 제한됩니다.

  • 키 저장소에는 하나의 부모 저장소만 있을 수 있습니다. 부모 모델의 임의 체인을 가질 수 없습니다.
  • 키 저장소에는 개념이 없습니다. 키/값/메타데이터 튜플의 사전만 가질 수 있습니다. 즉, 키 저장소에 있는 키가 정적입니다. 동적 언어 시스템에서 요청 시 만들 수 없습니다.
  • 규칙에 따라 메타데이터 정의 키 저장소의 값은 기본 값(내장 함수 및 속성 접근자)으로 제한됩니다.

키 저장소에는 임의의 키 번호(및 임의의 이름 지정)가 있을 수 있지만 의미 체계 값을 정의한 특정 이름이 있습니다. 현재 이러한 이름은 다음과 같습니다.

키 이름 값 유형 설명
PreferredRadix 정수: 2, 8, 10 또는 16 서수 값이 표시되어야 하는 반지름을 나타냅니다.
PreferredFormat 정수: PreferredFormat 열거형에 정의된 대로 값 표시를 위한 기본 서식 형식을 나타냅니다.
PreferredLength 정수 배열 및 기타 컨테이너의 경우 기본적으로 표시해야 하는 요소 수를 나타냅니다.
FindDerivation Boolean 디버그 호스트를 사용하기 전에 값에 대해 파생 형식 분석을 수행해야 하는지 여부를 나타냅니다(예: 표시).
도움말 문자열 사용자 인터페이스에서 적절하게 유용한 방식으로 표시할 수 있는 키에 대한 도구 설명 스타일 도움말 텍스트입니다.
ActionName 문자열 지정된 메서드(인수를 사용하지 않고 값을 반환하지 않는 메서드)가 작업임을 나타냅니다. 작업의 이름은 메타데이터에 지정됩니다. 사용자 인터페이스는 이 이름을 활용하여 상황에 맞는 메뉴 또는 기타 적절한 인터페이스에 옵션을 표시할 수 있습니다.
ActionIsDefault Boolean ActionName 키가 지정된 경우에만 유효하며 개체의 기본 동작임을 나타냅니다.
ActionDescription 문자열 ActionName 키를 지정한 경우에만 유효하며 작업에 대한 도구 설명 스타일 설명을 제공합니다. 이러한 텍스트는 사용자 인터페이스에서 적절하게 유용한 방식으로 표시할 수 있습니다.

메타데이터 저장소의 키에는 자체 메타데이터(광고 무한대)가 있을 수 있지만 현재는 사용할 수 없습니다. 대부분의 호출자는 IKeyStore 인터페이스의 메서드에서 메타데이터 매개 변수에 대해 null을 지정합니다.

핵심 메타데이터 인터페이스: IKeyStore

IKeyStore 인터페이스는 다음과 같이 정의됩니다.

DECLARE_INTERFACE_(IKeyStore, IUnknown)
{
   STDMETHOD(GetKey)(_In_ PCWSTR key, _COM_Errorptr_opt_ IModelObject** object, _COM_Outptr_opt_result_maybenull_ IKeyStore** metadata) PURE;
   STDMETHOD(SetKey)(_In_ PCWSTR key, _In_opt_ IModelObject* object, _In_opt_ IKeyStore* metadata) PURE;
   STDMETHOD(GetKeyValue)(_In_ PCWSTR key, _COM_Errorptr_opt_ IModelObject** object, _COM_Outptr_opt_result_maybenull_ IKeyStore** metadata) PURE;
   STDMETHOD(SetKeyValue)(_In_ PCWSTR key, _In_ IModelObject* object) PURE;
   STDMETHOD(ClearKeys)() PURE;
}

GetKey

GetKey 메서드는 IModelObject의 GetKey 메서드와 유사합니다. 키 저장소 또는 키 저장소의 부모 저장소에 있는 경우 지정된 키의 값을 반환합니다. 키 값이 속성 접근자인 경우 GetValue 메서드는 속성 접근자에서 호출되지 않습니다. IModelObject에 박스된 실제 IModelPropertyAccessor가 반환됩니다. 이러한 이유로 클라이언트가 GetKeyValue를 호출하는 것이 일반적입니다.

SetKey

SetKey 메서드는 IModelObject의 SetKey 메서드와 유사합니다. 키를 만들고 키 저장소 내에서 메타데이터를 연결할 수 있는 유일한 방법입니다.

GetKeyValue

GetKeyValue 메서드는 메타데이터 저장소 내에서 특정 키의 값을 찾기 위해 클라이언트가 이동하는 첫 번째 메서드입니다. 키 인수로 지정된 키가 저장소 내에 있는 경우(또는 부모 저장소) 해당 키의 값과 연결된 메타데이터가 반환됩니다. 키 값이 속성 접근자(IModelObject에 박스된 IModelPropertyAccessor)인 경우 GetKeyValue 및 반환된 속성의 기본 값에 의해 속성 접근자의 GetValue 메서드가 자동으로 호출됩니다.

SetKeyValue

SetKeyValue 메서드는 IModelObject의 SetKeyValue 메서드와 유사합니다. 이 메서드는 메타데이터 저장소 내에서 새 키를 만들 수 없습니다. 키 인수로 표시된 대로 기존 키가 있는 경우 해당 값은 표시된 대로 설정됩니다. 키가 속성 접근자인 경우 기본 값을 설정하기 위해 속성 접근자에서 SetValue 메서드가 호출됩니다. 메타데이터는 일반적으로 한 번 만들어지면 정적입니다. 메타데이터 키 저장소에서 이 메서드를 사용하는 경우는 드물어야 합니다.

ClearKeys

ClearKeys 메서드는 IModelObject의 ClearKeys 메서드와 유사합니다. 지정된 메타데이터 저장소에서 모든 키를 제거합니다. 이 메서드는 부모 저장소에 영향을 주지 않습니다.

데이터 모델의 개체 열거형

데이터 모델에서 개체 열거

데이터 모델에는 IKeyEnumerator 및 IRawEnumerator라는 두 가지 핵심 키 열거형 인터페이스가 있습니다. 이러한 인터페이스는 두 가지 핵심 인터페이스이지만 다음 세 가지 스타일 중 하나로 개체를 열거하는 데 사용할 수 있습니다.

- 기본 속성 접근자를 해결하지 않고 개체의 키와 해당 값/메타데이터를 열거하기 위해 EnumerateKeys 호출을 통해 IKeyEnumerator 인터페이스를 가져올 수 있습니다. 이 열거형 스타일은 IModelObjects로 박스된 원시 IModelPropertyAccessor 값을 반환할 수 있습니다.

- 개체의 키/원시 값과 해당 값/메타데이터를 열거하기 위해 EnumerateKeyValues 또는 EnumerateRawValues 호출을 통해 IKeyEnumerator 및 IRawEnumerator 인터페이스를 가져올 수 있습니다. 열거형에 있는 모든 속성 접근자는 이러한 열거형 중에 기본 GetValue 메서드에 대한 호출을 통해 자동으로 확인됩니다.

참조 - 개체의 키/원시 값에 대한 참조를 열거하기 위해 EnumerateKeyReferences 또는 EnumerateRawReferences에 대한 호출을 통해 IKeyEnumerator 및 IRawEnumerator 인터페이스를 가져올 수 있습니다. 이러한 참조를 저장하고 나중에 기본 키 또는 원시 값을 얻거나 설정하는 데 사용할 수 있습니다.

KeyEnumerator: 가상 키 열거형

IKeyEnumerator 인터페이스는 인스턴스 개체 내의 모든 키(키, 값 또는 참조 기준)와 부모 모델 체인의 모든 연결된 부모 모델을 열거하는 단일 인터페이스입니다. 인터페이스는 다음과 같이 정의됩니다.

DECLARE_INTERFACE_(IKeyEnumerator, IUnknown)
{
    STDMETHOD(Reset)() PURE;
    STDMETHOD(GetNext)(_Out_ BSTR* key, _COM_Errorptr_opt_ IModelObject** value, _COM_Outptr_opt_result_maybenull_ IKeyStore** metadata) PURE;
}

Reset

Reset 메서드는 열거자를 처음 획득했을 때의 위치(예: 열거형의 첫 번째 요소 앞)로 다시 설정합니다. GetNext에 대한 후속 호출은 첫 번째 열거형 키를 반환합니다.

GetNext

GetNext 메서드는 모두 열거자를 앞으로 이동하고 열거형의 해당 위치에 있는 키를 반환합니다.

IRawEnumerator: 네이티브 또는 기본 언어 열거형(C/C++) 구문

IRawEnumerator 인터페이스는 디버그 대상의 주소 공간 내에서 네이티브 구문을 나타내는 개체 내의 모든 네이티브/언어 구문(값 또는 참조 기준)을 열거하는 단일 인터페이스입니다. 인터페이스는 다음과 같이 정의됩니다.

DECLARE_INTERFACE_(IRawEnumerator, IUnknown)
{
    STDMETHOD(Reset)() PURE;
    STDMETHOD(GetNext)(_Out_opt_ BSTR* name, _Out_opt_ SymbolKind *kind, _COM_Errorptr_opt_ IModelObject** value) PURE;
}

Reset

Reset 메서드는 열거자를 처음 획득했을 때의 위치(예: 열거형의 첫 번째 요소 앞)로 다시 설정합니다. GetNext에 대한 후속 호출은 첫 번째 열거형 네이티브/언어 구문을 반환합니다.

GetNext

GetNext 메서드는 모두 열거자를 앞으로 이동하고 열거형의 해당 위치에 있는 네이티브/언어 구문을 반환합니다.


참고 항목

이 항목은 C++에서 액세스할 수 있는 인터페이스, 이를 사용하여 C++ 기반 디버거 확장을 빌드하는 방법 및 C++ 데이터 모델 확장에서 다른 데이터 모델 구문(예: JavaScript 또는 NatVis)을 사용하는 방법을 설명하는 시리즈의 일부입니다.

디버거 데이터 모델 C++ 개요

디버거 데이터 모델 C++ 인터페이스

디버거 데이터 모델 C++ 개체

디버거 데이터 모델 C++ 추가 인터페이스

디버거 데이터 모델 C++ 개념

디버거 데이터 모델 C++ 스크립팅