次の方法で共有


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