IDataModelManager::RegisterModelForTypeSignature メソッド (dbgmodel.h)
RegisterModelForTypeSignature メソッドは、呼び出し元が特定の型 (または型のセット) の正規ビジュアライザーを登録するために使用する主要なメソッドです。 正規ビジュアライザーは、特定の型 (または型のセット) の表示を実質的に引き継ぐデータ モデルです。 デバッガー のユーザー インターフェイスに表示される型のネイティブ/言語ビューの代わりに、登録されたデータ モデルによって表示される型のビューが表示されます (希望するユーザーのネイティブ/言語ビューに戻る手段と共に)。 このメソッドに渡される型シグネチャは、複数の具象型と一致する場合があります。 特定の型インスタンスに複数の一致がある場合は、最適な一致のみが返されます。 1 つの型シグネチャは、特定の具象型をより具体的に参照している場合、別のシグネチャよりも一致していると見なされます。 例として次に示します。
A) std::pair<*, *>
B) std::pair<int, *>
C) std::pair<int, float>
上記の 3 つの型シグネチャ (A、B、C) が登録され、具象型に対してチェックされる場合:
std::pair<int, float>
Alltype シグネチャは、この型インスタンスと一致します。 2 つ目は、int (B の最初のテンプレート引数) がワイルドカード (A の最初のテンプレート引数) よりも一致する方が良いため、最初のテンプレートよりも一致が優れています。 同様に、3 つ目は 2 番目よりも一致が優れています (ワイルドカードのない合計一致です)。
RegisterModelForTypeSignature メソッドでは、重複する型シグネチャの登録は許可されません。 特定の型シグネチャの正規ビジュアライザーとして登録できるデータ モデルは 1 つだけです。 同じ型シグネチャを 2 回登録しようとすると失敗します。 同様に、RegisterModelForTypeSignature メソッドは、登録する任意の型インスタンスとあいまいに一致する型シグネチャを許可しません。 例
D) std::pair<int, *>
E) std::pair<*, int>
上記の 2 つの型シグネチャ (D と E) の両方を登録することはできません。 一部の型では、どの署名が適用され、最適かが明確になります。 たとえば、
std::pair<int, float>
float と int は一致しないため、これらの (D) の最初の とのみ一致します。 ただし、次の点を考慮すると、完全にあいまいになります。
std::pair<int, int>
これらのシグネチャはどちらも同様に優れている (どちらも具象とワイルドカードが 1 つ一致します)。 これらの型シグネチャはあいまいです。 そのため、この理由により、2 番目の を登録する呼び出しは失敗します。
構文
HRESULT RegisterModelForTypeSignature(
IDebugHostTypeSignature *typeSignature,
IModelObject *dataModel
);
パラメーター
typeSignature
登録されている型シグネチャ。 この型シグネチャに最も一致する具象型のネイティブ/言語オブジェクトには、dataModel 引数によって指定されたデータ モデルが自動的にアタッチされます。
dataModel
指定された型シグネチャに一致する型の正規ビジュアライザーになるデータ モデル。
戻り値
このメソッドは、成功または失敗を示す HRESULT を返します。 このメソッドは、同一またはあいまいな型シグネチャを登録できません。
注釈
サンプル コード
ComPtr<IDataModelManager> spManager; /* get the data model manager */
ComPtr<IDebugHost> spHost; /* get the debug host */
ComPtr<IModelObject> spDataModel; /* create a data model (see
CreateDataModelObject) */
ComPtr<IDebugHostSymbols> spSym;
if (SUCCEEDED(spHost.As(&spSym)))
{
// Create a signature to match MyType<*>
ComPtr<IDebugHostTypeSignature> spTypeSignature;
if (SUCCEEDED(spSym->CreateTypeSignature(L"MyType<*>",
nullptr,
&spTypeSignature)))
{
// Register the model for std::vector<*>
if (SUCCEEDED(spManager->RegisterModelForTypeSignature(spTypeSignature.Get(),
spDataModel.Get()))
{
// Every instance matching MyType<*> will now have spDataModel
// attached as the parent. Further, such parent is considered
// the canonical visualizer for all types matching MyType<*> since
// it was registered via RegisterModelForTypeSignature instead of
// RegisterExtensionForTypeSignature.
}
}
}
要件
要件 | 値 |
---|---|
Header | dbgmodel.h |