このトピックでは、メタデータ、概念、オブジェクト列挙など、デバッガー C++ データ モデルに関連付けられているいくつかの追加インターフェイスについて説明します。
デバッガー のデータ モデル メタデータ インターフェイスの
データ モデルの中心概念の 1 つは、オブジェクト (特に合成型) がキー/値/メタデータ タプルのディクショナリであるという点です。 各キーには、キーとその潜在的な値を囲むさまざまな内容を記述するメタデータのストア全体を関連付けることができます。 メタデータでは、キーの値は変更されないことに注意してください。 キーとその値に関連付けられている補助的な情報のみで、キーとその値のプレゼンテーションまたはその他の関連属性に影響を与える可能性があります。
一部の意味では、メタデータ ストアは、データ モデル内のオブジェクトの本質であるキー/値/メタデータタプルと大きな違いはありません。 ただし、このビューからは簡略化されています。 メタデータ ストアは、IKeyStore インターフェイスによって表されます。 キー/値/メタデータ タプルのコレクションでもありますが、メタデータ キー ストアとモデル オブジェクトで実行できることには制限があります。
- キー ストアには、単一の親ストアのみを含めることができます。任意の親モデルのチェーンを持つことはできません。
- キー ストアには概念はありません。 キー/値/メタデータタプルのディクショナリのみを持つことができます。 つまり、キー ストアに存在するキーは静的です。 動的言語システムでは、必要に応じて作成することはできません。
- 規則上のみ、メタデータ定義キー ストア内の値は、基本値 (組み込みおよびプロパティ アクセサー) に制限されます。
キー ストアにはキーの任意の数 (および任意の名前付け) を指定できますが、セマンティック値が定義されている特定の名前があります。 現在、これらの名前は次のとおりです。
キー名 | 価値の種類 | 説明 |
---|---|---|
PreferredRadix | 整数: 2、8、10、または 16 | 表示する序数の基数を示します。 |
PreferredFormat | 整数: PreferredFormat 列挙型で定義されているとおり | 値の表示に適した書式の種類を示します |
PreferredLength | 整数 | 配列とその他のコンテナーの場合、既定で表示する必要がある要素の数を示します |
FindDerivation | ボーリアン | デバッグ ホストが使用する前に値に対して派生型分析を実行する必要があるかどうかを示します (例: 表示) |
ヘルプ | 糸 | ツール ヒント スタイルは、ユーザー インターフェイスによって適切に役立つ方法で表示できるキーのヘルプ テキストです。 |
ActionName | 糸 | 指定されたメソッド (引数を受け取り、値を返さないメソッド) がアクションであることを示します。 アクションの名前はメタデータで指定されます。 ユーザー インターフェイスでは、この名前を使用して、コンテキスト メニューまたはその他の適切なインターフェイスでオプションを表示できます。 |
ActionIsDefault | ボーリアン | ActionName キーが指定されている場合にのみ有効で、これがオブジェクトの既定のアクションであることを示します。 |
アクションの説明 | 糸 | 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) の場合、プロパティ アクセサーの GetValue メソッドは、GetKeyValue と返されるプロパティの基になる値によって自動的に呼び出されます。
SetKeyValue の
SetKeyValue メソッドは、IModelObject の SetKeyValue メソッドに似ています。 このメソッドでは、メタデータ ストア内に新しいキーを作成することはできません。 キー引数で示されている既存のキーがある場合、その値は示されたとおりに設定されます。 キーがプロパティ アクセサーの場合、基になる値を設定するために、プロパティ アクセサーで SetValue メソッドが呼び出されます。 メタデータは通常、作成後に静的であることに注意してください。 メタデータ キー ストアでこのメソッドを使用する頻度は低いはずです。
ClearKeys の
ClearKeys メソッドは、IModelObject の ClearKeys メソッドに似ています。 指定されたメタデータ ストアからすべてのキーが削除されます。 このメソッドは、親ストアには影響しません。
データ モデルでのオブジェクト列挙の
データ モデル でのオブジェクトの列挙の
データ モデルには、IKeyEnumerator と IRawEnumerator の 2 つの主要な列挙インターフェイスがあります。 これらは 2 つのコア インターフェイスですが、次の 3 つのスタイルのいずれかでオブジェクトを列挙するために使用できます。
Keys - IKeyEnumerator インターフェイスは、基になるプロパティ アクセサーを解決せずに、オブジェクトのキーとその値/メタデータを列挙するために EnumerateKeys の呼び出しを介して取得できます。 このスタイルの列挙では、IModelObjects にボックス化された生の IModelPropertyAccessor 値を返すことができます。
値 - IKeyEnumerator インターフェイスと IRawEnumerator インターフェイスは、オブジェクトのキー/生の値とその値/メタデータを列挙するために、EnumerateKeyValues または EnumerateRawValues の呼び出しを介して取得できます。 列挙型に存在するすべてのプロパティ アクセサーは、このような列挙の間に、基になる GetValue メソッドの呼び出しによって自動的に解決されます。
参照 - IKeyEnumerator インターフェイスと IRawEnumerator インターフェイスは、オブジェクトのキー/生値への参照を列挙するために、EnumerateKeyReferences または EnumerateRawReferences を呼び出して取得できます。 このような参照を保存し、後で基になるキーまたは生の値を取得または設定するために使用できます。
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 の
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 の
GetNext メソッドはどちらも列挙子を前方に移動し、列挙型のその位置にあるネイティブ/言語コンストラクトを返します。
関連項目
このトピックは、C++ からアクセスできるインターフェイス、C++ ベースのデバッガー拡張機能の構築に使用する方法、および C++ データ モデル拡張機能から他のデータ モデルコンストラクト (JavaScript や NatVis など) を使用する方法について説明するシリーズの一部です。