IDebugHostSymbols::CreateTypeSignature メソッド (dbgmodel.h)
CreateTypeSignature メソッドは、モジュールと型名を含めることで、具象型のセットとの照合に使用できるシグネチャを作成します。 型名シグネチャ文字列の形式は、デバッグ対象の言語 (およびデバッグ ホスト) に固有です。 C/C++ の場合、シグネチャ文字列は NatVis 型仕様と同じです。 つまり、シグネチャ文字列は、テンプレート引数にワイルドカード (*として指定) を使用できる型名です。
構文
HRESULT CreateTypeSignature(
PCWSTR signatureSpecification,
IDebugHostModule *module,
IDebugHostTypeSignature **typeSignature
);
パラメーター
signatureSpecification
この署名が適用される型を識別する署名文字列。 この文字列の形式は、デバッグする言語に固有です。 C/C++ の場合、これは NatVis 型の仕様に相当します。 たとえば、テンプレート引数 (*として指定) にワイルドカードを使用できる型名です。
module
指定した場合、指定されたモジュール内に含まれる型のみがシグネチャと一致します。 指定しない場合、任意のモジュール内の型がシグネチャと一致する可能性があります。
typeSignature
作成された型シグネチャ オブジェクトがここに返されます。
戻り値
このメソッドは、成功または失敗を示す HRESULT を返します。
備考
サンプル コード の
ComPtr<IDebugHost> spHost; /* get the host */
ComPtr<IDebugHostSymbols> spSym;
if (SUCCEEDED(spHost.As(&spSym)))
{
// Create a type signature for MyTemplateType<*>
ComPtr<IDebugHostTypeSignature> spSig1;
if (SUCCEEDED(spSym->CreateTypeSignature(L"MyTemplateType<*>",
nullptr,
&spSig1)))
{
// spSig1 is a type signature which will match any concrete template
// type with a base name of MyTemplateType and *ANY* template arguments.
// This is true regardless of the module in which the type is contained.
}
ComPtr<IDebugHostModule> spMyModule;
if (SUCCEEDED(spSym->FindModuleByName(USE_CURRENT_HOST_CONTEXT,
L"MyModule.dll",
&spMyModule)))
{
// Create a type signature for MyTemplateType<*> within MyModule.dll.
ComPtr<IDebugHostTypeSignature> spSig2;
if (SUCCEEDED(spSym->CreateTypeSignature(L"MyTemplateType<*>",
nullptr,
&spSig2)))
{
// spSig2 is a type signature which will match any concrete
// template type with a base name of MyTemplateType and *ANY*
// template arguments that is within the particular MyModule.dll
// that's in the current UI context (e.g.: process) of the debugger.
// This means if the host is debugging multiple processes
// and you switch processes, a MyTemplateType<*> in an identically
// named and versioned MyModule.dll will *NOT* match this signature.
}
}
}
FindModuleByName、CreateTypeSignature、CreateTypeSignatureForModuleRange でのシンボル モジュールの一致の違い
FindModuleByName では、渡されたモジュール名をモジュールの実際のイメージ名 (例: My Module.dll) にするか、デバッガー エンジンで参照できる名前 (例: MyModule または MyModule_<hex_base>) にすることができます。
CreateTypeSignatureForModuleRange 呼び出し、名前/nullptr/nullptr を渡すと、任意のバージョンの名前と一致するすべてのモジュールに一致する署名が作成されます。
CreateTypeSignature 関数に渡されるモジュール名は、モジュールの実際のイメージ名 (例: MyModule.dll) のみを受け入れます。
FindModuleByName 呼び出し、そのモジュールで CreateTypeSignature を呼び出すと、渡されたモジュールの特定のインスタンスにのみ一致する署名が作成されます。 読み込まれるモジュールのコピーが 2 つある場合 (たとえば、64 ビット Windows で実行されている 32 ビット プロセスの ntdll) は、渡された特定のインスタンスにのみ一致します。 また、DLL がアンロードされて再読み込みされた場合も一致しなくなります。 シグネチャは、デバッガーによって認識されるモジュールの特定のインスタンスに関連付けられます。
必要条件
要件 | 価値 |
---|---|
ヘッダー | dbgmodel.h |
関連項目
IDebugHostSymbols インターフェイス の
FindModuleByName の
CreateTypeSignatureForModuleRange の