디버거 데이터 모델 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 메서드는 IModelObject의 GetKey 메서드와 유사합니다. 키 저장소 또는 키 저장소의 부모 저장소에 있는 경우 지정된 키의 값을 반환합니다. 키 값이 속성 접근자인 경우 GetValue 메서드는 속성 접근자에서 호출되지 않습니다. IModelObject에 박스된 실제 IModelPropertyAccessor가 반환됩니다. 이러한 이유로 클라이언트가 GetKeyValue를 호출하는 것이 일반적입니다.
SetKey 메서드는 IModelObject의 SetKey 메서드와 유사합니다. 키를 만들고 키 저장소 내에서 메타데이터를 연결할 수 있는 유일한 방법입니다.
GetKeyValue 메서드는 메타데이터 저장소 내에서 특정 키의 값을 찾기 위해 클라이언트가 이동하는 첫 번째 메서드입니다. 키 인수로 지정된 키가 저장소 내에 있는 경우(또는 부모 저장소) 해당 키의 값과 연결된 메타데이터가 반환됩니다. 키 값이 속성 접근자(IModelObject에 박스된 IModelPropertyAccessor)인 경우 GetKeyValue 및 반환된 속성의 기본 값에 의해 속성 접근자의 GetValue 메서드가 자동으로 호출됩니다.
SetKeyValue 메서드는 IModelObject의 SetKeyValue 메서드와 유사합니다. 이 메서드는 메타데이터 저장소 내에서 새 키를 만들 수 없습니다. 키 인수로 표시된 대로 기존 키가 있는 경우 해당 값은 표시된 대로 설정됩니다. 키가 속성 접근자인 경우 기본 값을 설정하기 위해 속성 접근자에서 SetValue 메서드가 호출됩니다. 메타데이터는 일반적으로 한 번 만들어지면 정적입니다. 메타데이터 키 저장소에서 이 메서드를 사용하는 경우는 드물어야 합니다.
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 메서드는 열거자를 처음 획득했을 때의 위치(예: 열거형의 첫 번째 요소 앞)로 다시 설정합니다. 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 메서드는 열거자를 처음 획득했을 때의 위치(예: 열거형의 첫 번째 요소 앞)로 다시 설정합니다. GetNext에 대한 후속 호출은 첫 번째 열거형 네이티브/언어 구문을 반환합니다.
GetNext 메서드는 모두 열거자를 앞으로 이동하고 열거형의 해당 위치에 있는 네이티브/언어 구문을 반환합니다.
참고 항목
이 항목은 C++에서 액세스할 수 있는 인터페이스, 이를 사용하여 C++ 기반 디버거 확장을 빌드하는 방법 및 C++ 데이터 모델 확장에서 다른 데이터 모델 구문(예: JavaScript 또는 NatVis)을 사용하는 방법을 설명하는 시리즈의 일부입니다.