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 を呼び出し、name/nullptr/nullptr を渡すと、任意のバージョンのその名前に一致するモジュールと一致するシグネチャが作成されます。
CreateTypeSignature 関数に渡されるモジュール名は、モジュールの実際のイメージ名 (例: MyModule.dll) のみを受け入れます。
FindModuleByName を呼び出し、そのモジュールで CreateTypeSignature を呼び出すと、渡されたモジュールの特定のインスタンスにのみ一致する署名が作成されます。 読み込まれるモジュールのコピーが 2 つある場合 (たとえば、64 ビット Windows で実行されている 32 ビット プロセスの ntdll) は、渡された特定のインスタンスにのみ一致します。 また、その DLL がアンロードされ、再読み込みされた場合も一致しなくなります。 シグネチャは、デバッガーによって知られているモジュールの特定のインスタンスに関連付けられます。
要件
要件 | 値 |
---|---|
Header | dbgmodel.h |